Observe que index.php
e /index.php
são URIs diferentes. Você esqueceu barras em suas reescritas.
Tenho a seguinte configuração do nginx:
location / {
try_files $uri $uri/ index.html =404;
if (!-e $request_filename) {
rewrite ^/(.+)$ index.php?url=$1 last;
}
}
location ~ .php$ {
# protection from known vulnerability
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
( fastcgi_params
são padrões do pacote Debian)
funciona para o pedido /
, no entanto, quando o pedido é reescrito, o arquivo principal não é encontrado:
é /contact
, que deve ser reescrita para /index.php?url=contact
*104 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 10.0.0.1, server: localhost, request: "GET /contact HTTP/1.0", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "localhost:8080"
Não consigo obter de logs o que é realmente fastcgi tentando carregar, qual caminho?
Esta é uma maneira melhor de implementar a mesma funcionalidade:
location / {
try_files $uri $uri/ @rewrite;
}
location @rewrite {
rewrite ^/(.+)$ /index.php?url=$1 last;
}
e depois o seu bloco de localização do PHP como na sua configuração.
try_files
verifica primeiro se o arquivo correspondente a $ uri existe, então um diretório e, se nenhum deles existir, usa o local de reescrita, que executa o script.
O motivo mais provável de sua configuração não estar funcionando foi o /
ausente do caminho de script de reconfiguração. Enfim, essa configuração é mais simples é a preferida com o nginx.