Назад | Перейти на главную страницу

Чистые URL-адреса и расширение php на nginx

Я просмотрел десятки других вопросов и ссылок в Интернете - и, по всем моим расчетам, моя установка должна работать, но это не так.

У меня есть установка nginx с php-fpm. Если я пытаюсь получить доступ к файлу .php, он работает правильно, и я получаю правильные результаты. Я получил это в своем файле конфигурации:

location ~ \.php$ {
    try_files $uri =404;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
}

Теперь я хочу настроить свое веб-приложение так, чтобы /somedir/file автоматически выполняет /somdir/file.php пока все еще отображается /somdir/file в адресной строке браузера. Поэтому я изменил свою конфигурацию, чтобы она содержала следующее:

location / {
    try_files $uri $uri/ $uri.php?query_string
}

это вид работает, то есть сервер обращается к файлу .php. Однако вместо того, чтобы выполнять его с использованием существующего location ~ \.php$ блок выше, он просто выводит исходный код php при загрузке в браузер. Если я добавлю .php вручную к запрошенному URL, то php будет выполнен.

Такое ощущение, что однажды сервер соответствует try_files к $uri.php, затем он не выполняет еще один проход в местах, чтобы увидеть, что ему нужно делать с файлами php. Я попытался разместить блок php выше и ниже location /, но это не имеет значения.

Как я могу запустить php?

Вы пробовали с rewrite директива? Например:

location / {
    try_files $uri $uri/ @extensionless-php;
    index index.html index.htm index.php;
} 

location ~ \.php$ {
    try_files $uri =404;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
}

location @extensionless-php {
    rewrite ^(.*)$ $1.php last;
}

Источник: http://www.tweaktalk.net/60/nginx-remove-php-file-extension-from-url

try_files всегда выполняется в текущем контексте, поэтому он служит вашим php-скрипты в виде простых файлов - отсутствует текущее местоположение fastcgi_pass. try_files зло, потому что вместо прямолинейности он создает сомнительные блоки, избегайте этого.

В то же время регулярное выражение- локации имеют приоритет перед обычными локациями, поэтому при обратном порядке ничего не меняется.

Лично я считаю, что прячется .php расширения из адресной строки бесполезны, так как они добавляют больше кода в файл конфигурации.