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

Правило перезаписи nginx для замены окончания .php на /

По сути, я хочу, чтобы ".php" был заменен на "/". Я попытался просто поместить свое правило в том же месте, где находится fastcgi.

location ~ \.php$ {
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                include fastcgi_params;
                rewrite ^(.+)\.php$ /$1;
}

Однако, когда я перезапускаю nginx с этими настройками, я получаю внутреннюю ошибку сервера 500, и я даже не могу заставить сервер что-либо показать мне. Это из-за быстрого cgi? Как я могу обойти это?

Моя система: nginx / php5-fpm / apc / php5-memcache / Ubuntu 10.10

По сути, с вашим генеральным планом много проблем. Во-первых, поскольку вы удаляете .php, перезапись должна выполняться за пределами location ~ .php$ поскольку URL-адрес не будет заканчиваться на .php до тех пор, пока после он переписан. Во-вторых, ваш rewrite наоборот. Вам нужен URL http://www.example.com/foo/ бежать foo.php, поэтому перезапись должна быть

rewrite ^(.+)/ $1.php;

Но это означает, что КАЖДОМУ каталогу на вашем веб-сайте потребуется соответствующий файл .php, поскольку вы больше не сможете использовать index.php автоматически. Кроме того, если nginx не выполняет дедупликацию косой черты перед перезаписью, если кто-то ошибочно набирает адрес как http://www.example.com/foo// тогда он выполнит /foo/.php.

Наконец, сколько файлов PHP вы планируете создать? Вы действительно думаете, что serverfault имеет файл 304162.php для ответа на этот вопрос? (не тот URL-адрес serverfaults будет соответствовать вашей перезаписи, поскольку он не заканчивается на /, и они не используют PHP, я думаю)

Обычно чистые URL-адреса работают путем объявления определенного местоположения (например, /questions/), а затем переписать все ПОСЛЕ этого URL-адреса для запуска одним скриптом:

rewrite ^/questions/(.*)$ /questions.php?path=$1 last;

Вы также можете сделать что-нибудь вроде

rewrite ^/questions/([0-9]+)(/.*)?$ /questions.php?qid=$1&extra=$2 last;

Чтобы URL-адреса могли быть example.com/questions/1 example.com/questions/1/ example.com/questions/1/how-do-I-rewrite но example.com/questions/banana будет отклонен из-за отсутствия числового идентификатора вопроса.

Посмотрите, как люди настраивают чистые URL-адреса для Drupal или Wordpress. По сути, каждый запрос несуществующего файла переписывается как /index.php?q=$1, где index.php смотрит на переменную "q", чтобы выяснить, что она должна делать.