Я пишу код 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 и т. Д.