Remover "public" na URL para instalação do subdiretório?

1

Esta é a instalação do Laravel. O Laravel tem o diretório public separado para ser definido como root no Nginx. Na minha configuração, eu defino /var/www/web.dev/public como root.

Mas tenho muitas outras instalações individuais no subdiretório que podem ser acessadas em http://web.dev/dev/1/public/ , http://web.dev/dev/2/public/ e assim por diante.

O diretório public de instalações individuais localizadas em /var/www/web.dev/public/dev/1/public , /var/www/web.dev/public/dev/2/public e assim por diante.

Desejo remover o public para torná-lo acessível a partir de http://web.dev/dev/1/ , http://web.dev/dev/2/ e assim por diante.

Abaixo do que eu fiz até agora (usando regex para remover public na URL):

server {
    server_name web.dev;
    root   /var/www/web.dev/public;
    index  index.php;
    location / {
        rewrite ^\/([^\/]*)\/([^\/]*)\/([^\/]*)$ /public/$3 break;
    }
    try_files $uri $uri/ /index.php?$args;
    location ~ \.php$ {
        include         fastcgi_params;
        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass    unix:/run/php/php7.0-fpm.sock;
    }
}

Eu tentei vários outros regex e ainda sem sorte:

    location ^\/(.*)\/public {
        rewrite ^(.*)$ /public/$2 break;
    }
    
por Isak Pontus 01.12.2017 / 12:29

1 resposta

0

Colocar o rewrite...break no bloco location / significa que .php URIs não serão reescritos.

A correção mais simples será mover rewrite...break para o bloco server e usar last .

rewrite ^(/dev/[^/]+)((?!/public)/.*)?$ $1/public$2 last;

location / {
    try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
    ...
}

A expressão regular tem uma declaração de antecipação negativa para evitar várias adições de /public . Uma limitação dessa abordagem é que o controlador padrão também será o site principal (conforme definido pela instrução try_files ).

Veja este documento para saber mais.

Minha solução preferida seria separar a configuração dos sites de desenvolvimento e usar alias para construir o caminho para os arquivos. Uma vantagem é que os arquivos não precisam mais estar dentro do site principal.

location ~ ^(?<prefix>/dev/[^/]+)(?<suffix>/.*)?$ {
    alias /usr/local/www/test$prefix/public$suffix;

    if (!-e $request_filename) { rewrite ^(/dev/[^/]+) $1/index.php last; }

    location ~ \.php$ {
        if (!-f $request_filename) { return 404; }

        include         fastcgi_params;
        fastcgi_param   SCRIPT_FILENAME $request_filename;
        fastcgi_pass    unix:/run/php/php7.0-fpm.sock;
    }
}

Coloque este bloco acima de outros blocos de localização de expressão regular, pois expressões regulares são avaliadas em ordem. Observe o uso de $request_filename para o valor de SCRIPT_FILENAME .

Veja este documento para saber mais. Evite usar try_files com alias devido a este problema e anote esta cautela sobre o uso de if .

    
por 01.12.2017 / 13:45

Tags