我是Nginx的新手,并尝试将以下规则转换为从Apache到Nginx的WordPress网站。我在运行Nginx 1.4.6的Ubuntu机器上开始使用默认的Nginx配置。
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解释器执行它(很可能这是因为{{1}没有被召唤)。
fast-cgi
实现这一目标的最佳方式是什么?
答案 0 :(得分:1)
您的第一次尝试是正则表达式位置的无效语法。它应该看起来像这样:
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;
}
请参阅this document了解位置语法。
答案 1 :(得分:0)
我建议您以nginx https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/
的新用户身份阅读此陷阱文档和wordpress设置: https://www.nginx.com/resources/wiki/start/topics/recipes/wordpress/