.htaccess规则匹配太多

时间:2015-05-06 20:07:49

标签: regex apache .htaccess mod-rewrite

我正在尝试使用.htaccess识别没有尾随文件路径的网址。

这是我的整个.htaccess文件:

Options +FollowSymLinks
RewriteEngine on

# AnyTown Portal
RewriteCond %{HTTP_HOST} ^(.*)?anytownnews\..+\..{3}(?!\/(.+)) [NC]
RewriteRule ^(.*)$ anytownnews.php [QSA,NC,L,DPI]

网络上的四个不同的正则表达式解析器报告此正则表达式正确识别:

anytownnews.test.com

作为匹配和

anytownnews.test.com/junk 

作为不匹配。

但是,apache将此规则与两个URL匹配并执行替换。

我在这里错过了什么?

我也试过这个:

RewriteRule ^(.*)?anytownnews\..+\..{3}(?!\/(.+)) anytownnews.php [QSA,NC,L,DPI,END]

在此处测试时,我的测试用例都通过了http://htaccess.madewithlove.be/

但apache完全忽略了这个表达式。

任何想法都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

所以,似乎你希望这种情况发生

anytownnews.test.com -> rewritten to /anytownnews.php
anytownnews.test.com/folder/ -> don't rewrite
anytownnews.test.com/page1.html -> don't rewrite

这似乎只能实现

RewriteCond %{HTTP_HOST} ^anytownnews\..+\..{3} [NC]
RewriteRule ^$ /anytownnews.php [QSA,NC,L,DPI]

此外,您可以执行此操作并捕获子域并在RewriteRule中使用它,如果这是您的意图

RewriteCond %{HTTP_HOST} ^(?!www\.|signup\.)([a-z0-9-]+)\..+\..{3} [NC]
RewriteRule ^$ /%1.php [QSA,NC,L,DPI]

注意使用%1.php,而不是$1,因为我正在使用重写条件中的反向引用。

正则表达式将排除重写某些子域名(目前设置为www和注册,作为示例)。如果您不想排除任何子域,请使用。

RewriteCond %{HTTP_HOST} ^([a-z0-9-]+)\..+\..{3} [NC]
RewriteRule ^$ /%1.php [QSA,NC,L,DPI]