我正在尝试使用.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完全忽略了这个表达式。
任何想法都会受到赞赏。
答案 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]