2013-05-12 34 views
0

如何使用modrewrite將大寫網址/鏈接重定向到小寫文件,同時在我的網站上保留友好的URL(隱藏.html和.htm)?具有友好網址擴展程序隱藏情況的無效網址。 .htm和.html

目前使用以下重寫規則隱藏在我的網站的.htm和.html文件:

RewriteCond %{REQUEST_FILENAME}.htm -f 
RewriteRule !.*\.htm$ %{REQUEST_FILENAME}.htm [L] 

的目標是保持上述友好的URL規則的功能,但在同一時間重定向所有URL在我的地盤在URL的文件名部分中有大寫字母的文件名稱始終是小寫字母。例如用大寫字母,包括文件名看起來像這樣幾個環節: http://sub.domain.com/dir1/100007ABCD但希望最終的URL地址來爲這樣的搜索引擎:http://sub.domain.com/dir1/100007abcd

我目前的靜態文件名包括的.htm擴展這樣的: http://sub.domain.com/dir1/100007abcd.htm

另外:新規則需要重寫也該網站上的所有.html文件,以友好的,因爲我有兩個名爲.htm和.html文件(currentl無論是現在還是規則處理),但.html文件唐不需要重定向到小寫的網址

回答

0

您需要使用Apache's internal tolower function定義重寫映射。這隻能在虛擬主機或服務器的配置來實現,並會導致一個錯誤,如果你試圖把這些指令在htaccess文件:

RewriteEngine On 
RewriteMap lowercase int:tolower 

然後,在你的htaccess文件,你可以使用這樣的超出您已有的任何重寫規則。之前的任何規則,你使用友好的URL的東西重定向規則一定要遵守:

# check that the lower case version of the URI is different than the unchanged URI 
RewriteCond %{REQUEST_URI} /([^/]+)$ 
RewriteCond ${lowercase:%1}::%1 !^(.*)::\1$ 
RewriteRule ^(?:(.+/)|)(.*)$ /$1${lowercase:$2} [L,R=301] 

這將重定向任何請求的URI,其最後pathnode(該/A/B/C路徑的最後部分,例如Ç)具有大寫字母。我要解釋一下這些規則做:

  • RewriteCond %{REQUEST_URI} /([^/]+)$:這個條件只提取最後pathnode成反向引用,稍後使用的%1
  • RewriteCond ${lowercase:%1}::%1 !^(.*)::\1$:此條件採用先前提取pathnode,創建字符串,即全部小寫pathnode,::和pathnode。正則表達式假定較低的加殼版本與未修改的版本不同。這意味着最後一個路徑節點中有一個大寫字母。
  • RewriteRule ^(?:(.+/)|)(.*)$ /$1${lowercase:$2} [L,R=301]:只有滿足前2條件時纔會應用此規則。它提取最後一個路徑節點(由$2反向引用表示)以及它之前的所有內容(由$1反向引用表示)。然後它調用最後一個pathnode上的「小寫」函數,301重定向瀏覽器。
+0

我的服務器管理員直接將以下內容作爲自定義規則添加到Apaache RewriteMap中,該功能現在使這些文件不區分大小寫,但不會重定向到小寫。這裏是直接添加到Apache上的RewriteMap的自定義代碼,如果有人使用它,因爲它的工作: RewriteMap tolowercase int:tolower RewriteRule ^(。*)$ $ {tolowercase:$ 1} 我會聯繫管理員根據您的建議調整apache RewriteMap並測試您的規則。謝謝。 – user2278150 2013-05-12 23:57:47