在RewriteCond中匹配完整的URL

时间:2014-06-26 12:42:09

标签: .htaccess mod-rewrite

我正在尝试阻止对网站的所有POST访问(并返回403),除了2个IP和TO网址(http://mydomain.com/about-us/contact-us/)。

这就是我所拥有的:

RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REMOTE_ADDR} !=1.2.3.4
RewriteCond %{REMOTE_ADDR} !=4.3.2.1
RewriteCond %{REQUEST_URI} !^http://mydomain.com/about-us/contact-us/$
RewriteRule ^ / [F]

这些规则允许从所有IP正确访问,但仍无法访问联系人页面。我不确定我是否正确使用了REQUEST_URI?

我还尝试使用RewriteCond %{REQUEST_URI} !^/about-us/contact-us$RewriteCond %{REQUEST_URI} !^/about-us/contact-us/$之类的相对网址进行变体操作。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

在我看来,您对文件名的规则过于具体。如果你放松一下,它应该工作。我做了一些其他的美学调整。

尝试一下:

RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REMOTE_ADDR} !^1.2.3.4
RewriteCond %{REMOTE_ADDR} !^4.3.2.1
RewriteCond %{REQUEST_URI} !about-us/contact-us
RewriteRule ^ - [F]

答案 1 :(得分:0)

好吧事实证明我尝试它的方式(!^/about-us/contact-us$)是正确的,但是WordPress为永久链接生成的.htaccess规则要么停止工作,要么覆盖它。所以感谢Justing和zx81确认一般方法是正确的。

对于遇到此问题的任何其他人,当启用永久链接时,Wordpress(在编写WordPress v3。*时)将添加以下规则:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

那&#39; L&#39;指定最后一条规则会打破任何进一步的匹配。

我现在拥有的是:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REMOTE_ADDR} !=1.2.3.4
RewriteCond %{REMOTE_ADDR} !=4.3.2.1
RewriteCond %{REQUEST_URI} !^/about-us/contact-us/$
RewriteRule ^ / [F]
</IfModule>
# END WordPress

......它按计划运作。当然,只要在WP admin:/

中保存或更改固定链接设置,这将被覆盖