У меня возникли проблемы с переписыванием Nginx.
В Apache у меня была следующая перезапись, которая перенаправляла все запросы, которые не запрашивали файл PHP, на index.php:
Options +FollowSymLinks
RewriteEngine on
RewriteRule !^(.*)\.php$ ./index.php [QSA,L]
То же должно работать и на Nginx, но это не так. Эта перезапись ничего не делает (выкидывает 404 страницы на каждый запрос):
rewrite !^(.*)\.php$ ./index.php last;
Но если я уберу восклицательный знак, то перезапись действительно сработает, сделав прямо противоположное (она перенаправит все запросы файла * .php в файл index.php):
rewrite ^(.*)\.php$ ./index.php last;
Почему обратное не работает в Nginx, как в Apache? Что я должен изменить? Один с восклицательным знаком выдает либо ошибку 404, либо «Не указан входной файл». ошибки.
Используйте пару блоков Location. Что-то вроде:
location ~ *.php$ { }
location / {
rewrite ^(.*)$ ./index.php last;
}
Первый должен поймать все файлы, заканчивающиеся на .php, и просто получить к ним доступ. Второй перехватит все остальное и перепишет в ./index.php.
Это было правильное решение:
# Make sure to set this as your actual server WWW root
root html;
# Index file
index index.php;
# Rewrite that directs everything, except PHP to index file
# Make sure you place this before your "location ~ \.php$ {" for the server configuration.
location / {
rewrite ^ ./index.php last;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
По сути, первый говорит, что все должно быть направлено на PHP, а второй блок местоположения - это ваша типичная директива PHP. Итак, как только произойдет первая перезапись, она вызовет вторую (таким образом, PHP).