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

Как отменить это правило перезаписи Nginx?

У меня возникли проблемы с переписыванием 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).