У меня следующая конфигурация 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
являются значениями по умолчанию из пакета Debian)
это работает по запросу /
, однако при перезаписи запроса основной файл не обнаруживается:
запрос /contact
который следует переписать на /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"
Я не могу получить из журналов, что на самом деле пытается загрузить fastcgi, какой путь?
Обратите внимание, что index.php
и /index.php
- это разные URI. Вы забыли косые черты в своих переписываниях.
Это лучший способ реализовать ту же функциональность:
location / {
try_files $uri $uri/ @rewrite;
}
location @rewrite {
rewrite ^/(.+)$ /index.php?url=$1 last;
}
а затем ваш блок местоположения PHP, как в вашей настройке.
try_files
сначала проверяет, существует ли файл, соответствующий $ uri, затем каталог, и если ни один не существует, он использует rewrite -location, который запускает сценарий.
Наиболее вероятной причиной того, что ваша установка не работала, было отсутствие /
из пути к сценарию перезаписи. В любом случае, эта настройка проще и предпочтительнее для nginx.