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
.