2015-04-01 108 views
1

基本上我想匹配文件路徑下面的文件路徑的任何模式,直到文件名,甚至文件沒有擴展名。.htaccess正則表達式匹配文件擴展名或無擴展名

我幾乎到了那裏,但是一旦我嘗試使它與沒有擴展名的文件相匹配,它就會匹配到該行的其餘部分。

我的測試字符串

http://regexr.com/foo.html?test (//regexr.com/foo.html) 

http://regexr.com/foo?test  (//regexr.com/foo) 

http://regexr.com/foo.php?test (//regexr.com/foo.htm) 

http://regexr.com/foo.htm?test (//regexr.com/foo.htm) 

我現在的表情是\/(.+)\.php但這並不沒有擴展匹配第二個文件路徑,如果我做了最後收集可選的,它選擇通過GET參數。任何幫助將非常感激。


編輯下面是我試圖修改

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{THE_REQUEST} \ /(.+)(\.php|\.html?) 
RewriteRule^/%1.aspx [L,R=301] 
RewriteRule ^(.*).aspx$ $1.php [QSA] 

進一步編輯 正如指出的那樣,這可能是更好的要求作爲我的.htaccess塊重定向問題。 (另外,我刪除了html重定向,因爲它會導致性能下降,所以擴展名爲*.php的文件是唯一被重定向的文件。)

這些是我想如何處理這些文件; 301重定向到新的地址,然後繼續被服務器處理爲PHP這樣:

http://regexr.com/foo.html (Doesn't redirect, not processed) 
http://regexr.com/foo  (R to /foo.aspx, processed as /foo.php) 
http://regexr.com/foo.php (R to /foo.aspx, processed as /foo.php) 
http://regexr.com/foo.htm (Doesn't redirect, not processed) 
http://regexr.com/foo.aspx (Doesn't redirect, processed as /foo.php) 
+0

你能顯示你的規則嗎? – anubhava 2015-04-01 15:05:02

+0

我可以,不知道這可能有什麼幫助,但我會盡快更新我的答案 – 2015-04-01 15:07:54

回答

1

您可以使用此正則表達式:

\s/([^?.]+)(?:\.php|\.html?)?[?\s] 

RegEx Demo


重定向規則:

RewriteEngine On 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{THE_REQUEST} \s/([^?.]+)(?:\.php)?[?\s] [NC] 
RewriteRule^/%1.aspx? [L,R=302] 

RewriteRule ^(.+?)\.aspx$ $1.php [L,NC] 
+0

這仍然捕獲GET參數,這是我試圖避免 – 2015-04-01 15:27:13

+0

哦,這很容易,看到更新正則表達式 – anubhava 2015-04-01 15:34:04

+0

仍然無法得到這個工作,在我目前擁有'\ /(。+)(\。php | \ .html?)'的地方執行這個操作並不會發生任何重定向。另外,表達式還會選擇其他擴展名的文件,導致重定向循環,因爲它會選擇'* .aspx'並將其重定向到自己 – 2015-04-01 15:47:41

相關問題