2015-05-06 86 views
1

我正在嘗試使用.htaccess識別沒有結尾文件路徑的網址。.htaccess規則匹配太多

這是我整個.htaccess文件:在Web報告

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/

但這種表達是完全由阿帕奇忽視。

任何想法將不勝感激。

+0

什麼是您嘗試匹配的網址以及您不想匹配的網址? – anubhava

回答

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] 

此外,你可以做到這一點,捕捉子域,並在重寫規則使用,如果這是你的意圖

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]