Это произошло несколько раз на SO, но ни одно из решений не сработало. Вот что у меня сейчас есть:
location / {
try_files $uri $uri/ $uri.php;
}
location @php {
default_type application/x-httpd-php;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_param QUERY_STRING $args;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
location ~ \.php$ {
#fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_param QUERY_STRING $args;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
Этот пример содержит два варианта. Во-первых, первый раздел написан, чтобы протолкнуть URL / foo.php и URL / foo через последний раздел местоположения. Если я заменю $uri.php
в try_files
первой строфы с @php
следует использовать @php
расположение для URL / Foo.
Для @php
место, которое я пытался установить SCRIPT_FILENAME
чтобы:
fastcgi_param SCRIPT_FILENAME "/usr/share/nginx/html$uri.php";
fastcgi_param SCRIPT_FILENAME "$request_filename.php";
Ни один из них не сработал.
В отладке этого нет add_header
line когда-либо генерировал что-либо для URL / foo. Content-Type всегда установлен на application / octet-stream и, что забавно, ему всегда удается отправить обратно содержимое php-файла (он загружается).
Я явно делаю что-то не так, но я не вижу, что.
Вздох. Я знал, что если я спрошу это, я пойму это. Хорошо, здесь идет, это было решение:
location / {
try_files $uri $uri/ @php;
}
location @php {
fastcgi_param SCRIPT_FILENAME "$document_root$uri.php";
fastcgi_param PATH_TRANSLATED "$document_root$uri.php";
fastcgi_param QUERY_STRING $args;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
location ~ \.php$ {
#fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
Главное, чего мне не хватало, это fastcgi_param PATH_TRANSLATED "$document_root$uri.php";
линия. В этом вопросе я описал сценарий, в котором все php-запросы проходили через последнюю строфу, что устраняло бы необходимость в средней строфе. Это не сработало, @php
местоположение необходимо.
Кроме того, обратите внимание, что я перешел на $document_root
, В ряде вопросов, обсуждающих это, использовался буквальный корень документа для корня документа вместо переменной. Возможно, его не было в старых версиях nginx (я использую 1.4.6), но это лучший способ.
Других решений пока нет …