nginx + php-fpm без расширения .php

Это произошло несколько раз на 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-файла (он загружается).

Я явно делаю что-то не так, но я не вижу, что.

3

Решение

Вздох. Я знал, что если я спрошу это, я пойму это. Хорошо, здесь идет, это было решение:

    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), но это лучший способ.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]