По сути, я хочу, чтобы ".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", чтобы выяснить, что она должна делать.