Aqui está o trecho que provavelmente funcionará (não tenho o Forge para testá-lo) ...
location /blog {
try_files $uri $uri/ /blog/index.php$args$query_string;
location ~ .+\.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
}
}
# the following location is not needed - so commented out.
# location ^~ /blog/.+\.(jpg|jpeg|gif|css|png|js|ico|xml)$ {
# expires max;
# }
Voltando ao porquê sua configuração não funcionou ...
Quando você menciona algo assim ...
location /blog {
root /home/forge/example.com/public/blog;
# ... other configuration lines
}
O Nginx procurará "index.php" em uma pasta chamada "/home/forge/example.com/public/blog/blog", o que resultaria em um erro (404 ou 403, se estiver vazio, tente criar um desses como pasta e tente configurar um arquivo index.php com <?php phpinfo();
nele). Eu aninhei os blocos do PHP. É possível colocá-los sem aninhamento assim ...
location /blog {
try_files $uri $uri/ /index.php$args$query_string;
}
# pass the PHP scripts to FastCGI server
location ^~ /blog/.+\.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
allow 127.0.0.1;
# NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
# With php5-fpm:
fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
}
Por favor, note a mudança no modificador ^~
no segundo bloco de localização. Sem ele, o bloco de localização do site principal do PHP (Laravel) pode ter precedência que traria resultados indesejáveis. Mais informações sobre como funciona o bloco de localização e a ordem de precedência estão disponíveis em os documentos oficiais .
Para a instalação de subdiretórios, os arquivos estáticos devem funcionar corretamente, sem a necessidade de um bloco de localização separado.