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

Как указать Nginx не перезаписывать URL-адреса в выбранном месте

Я пишу код PHP CMS с чистой реализацией URL в Nginx. Чтобы повысить безопасность своего кода, я хочу переписать все запросы в моем корневом каталоге. / используя следующий тип:

rewrite ^(.*)$ /index.php?q=$1 last;

При такой перезаписи остальные скрипты php не будут доступны со стороны пользователя (они будут только, если они включены в php, я прав?). Однако я не хочу переписывать запрос в одном месте (для mi, /static/), потому что я буду обслуживать только статический контент, такой как изображения и CSS из этого места. Как я могу заставить эту перезапись не работать в определенных местах?

Понимание и использование location Директива должна решить вашу проблему. Когда за местоположением следует только строка префикса (т.е. без модификаторов, таких как '=' или '~ *'), самая длинная строка префикса сопоставляется первой. Например:

server {
    server_name example.org;
    root /var/www/site;

    location / {
        # Configuration A
    }

    location /static {
        # Configuration B
    }

В этой конфигурации URL example.org/static/foo.gif будет соответствовать конфигурации B, потому что строка префикса /static длиннее, чем /. Между тем, example.org/index.php?q=bar будет соответствовать конфигурации A, потому что это единственное совпадение.

Затем вы можете настроить конфигурацию A для обслуживания содержимого с помощью PHP, а конфигурация B для обслуживания статического содержимого.

Кроме того, я настоятельно рекомендую прочитать Подводные камни Nginx страницу, если вы еще этого не сделали. Он решает некоторые проблемы, которые имеют большое значение в вашей ситуации, такие как налогообложение перезаписи, безопасное использование fastcgi_pass и т. Д.