Эквивалент Apache RewriteCond в Nginx

Я новичок в Nginx и пытаюсь перевести следующее правило, которое у меня есть для сайта WordPress, с Apache на Nginx. Я начинаю с конфигурации Nginx по умолчанию на компьютере с Ubuntu под управлением Nginx 1.4.6.

RewriteCond %{REQUEST_URI} !^/wp-content/themes/path/to/exclude/file\.php
RewriteRule wp-content/themes/(.*\.php)$ log.php?f=$1 [L]

Правило выше переписывает все запросы wp-content/themes/*.php в security-log.phpза исключением файлов, определенных в RewriteCond править.

Из того, что я понял, способ сделать это в Nginx — это использовать location блок. Я попробовал следующее (я все еще не уверен, что делать, чтобы исключить определенные файлы / папки).

location = /wp-content/plugins/(.*\.php)$ {
try_files /security-log.php =404;
}

Вышеуказанное правило, похоже, полностью игнорируется (может, у меня что-то не так с регулярным выражением?).

Если я укажу фиксированный путь, как показано ниже, правило будет вызвано, но Nginx будет обслуживать файл PHP (браузер загрузит файл), а не выполнять его с помощью интерпретатора PHP (скорее всего, это потому, что fast-cgi не вызывается).

location = /wp-content/plugins/test.php {
try_files /security-log.php =404;
}

Каков был бы лучший способ достичь этого?

0

Решение

Ваша первая попытка неверного синтаксиса для местоположения регулярного выражения. Вероятно, это должно выглядеть так:

location ~ ^/wp-content/plugins/.*\.php$ { ... }

Скорее чем try_files директива, вы должны использовать rewrite, как это:

rewrite ^ /security-log.php last;

Конечно, ни один из подходов не соответствует функции .htaccess файл.

Вы уже заметили, что блок местоположения, который обрабатывает файл PHP, должен содержать fastcgi директивы. Это может быть достигнуто путем помещения их в отдельный файл и использования include директива, чтобы вытащить их в несколько location блоки.

Это означает, что .htaccess файл может быть реализован путем размещения расположения регулярного выражения перед существующим location ~ \.php$ блок. Например:

location = /wp-content/themes/path/to/exclude/file.php {
include common-php-directives;
}
location ~ ^/wp-content/themes/.*\.php$ {
rewrite ^/wp-content/themes/(.*\.php)$ /log.php?f=$1 last;
}
location ~ \.php$ {
include common-php-directives;
}

Увидеть этот документ для синтаксиса местоположения.

1

Другие решения

Я могу порекомендовать вам прочитать эту подводную документацию как новый пользователь nginx https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/

и для настройки WordPress:
https://www.nginx.com/resources/wiki/start/topics/recipes/wordpress/

0

По вопросам рекламы [email protected]