2012-12-11 79 views
6

刪除字符希望有人能看到我在做什麼錯,但這裏的故事...從URL與htaccess的

我目前的網站URL的從產品和類別名稱的電子商務軟件自動生成的,因此,如果產品/類別名稱包含非字母數字字符,則會在URL中編碼,這很痛苦。 EG:

mysite.com/Shop/Furniture-Set-Large-Table%2C-4-Chairs.html 

我移動到一個新的電子商務解決方案,這也從自動生成的產品名稱對應的URL的,但非常聰明,刪除所有非字母數字字符。它也轉換爲小寫,我已經設法找到一個htaccess的解決方案,將大寫重定向到小寫。它也沒有URL的「商店」部分,我也通過htaccess解決了這個問題。 EG:

mysite.com/furniture-set-large-table-4-chairs.html 

要刪除 '店鋪' 部分:

RedirectMatch 301 ^/Shop/(.*)$ http://www.mysite.com/$1 

要使用小寫字母大寫字母替換爲防止404錯誤:

RewriteCond %{REQUEST_URI} [A-Z] 
RewriteCond %{REQUEST_FILENAME} !\.(?:png|gif|ico|swf|jpg|jpeg|js|css|php|pdf)$ 
RewriteRule (.*) ${lc:http://www.mysite.com/$1} [R=301,L] 

這些都很好地工作。

所以我需要一個htaccess規則,或者可能有幾個規則來從URL中刪除這些編碼字符。我不需要替換它們,只需將它們刪除,因爲軟件將URL創建爲「Table%2C-4-Chairs」 - 因此只有%2C需要刪除。

我需要刪除從URL某些字符編碼,如:

逗號(%2C),撇號(%27),結腸癌(%3A)等

任何人可以建議適合的htaccess規則或規則?

在此先感謝。

回答

4

URI是URL解碼之前,它通過重寫引擎發送的,所以要符合實際的字符,而不是它們所編碼的同行:

RewriteRule ^(.*),(.*)$ /$1$2 [L] 
RewriteRule ^(.*):(.*)$ /$1$2 [L] 
RewriteRule ^(.*)\'(.*)$ /$1$2 [L] 
RewriteRule ^(.*)\"(.*)$ /$1$2 [L] 
# etc... 

RewriteCond %{ENV:REDIRECT_STATUS} 200 
RewriteRule ^(.*)$ http://www.mysite.com/$1 [L,R=301] 

重定向狀態允許國防部重寫知道,如果任何的上面的規則得到了應用(因此使得內部重定向狀態值= 200),那麼我們需要重定向,但是在清除所有特殊字符檢查之前,我們不會達到那部分規則。

你會想要這些規則全部之前任何重定向,以便規則可以循環和刪除任何這些字符的多個實例。然後,一旦沒有更多的特殊字符,重寫引擎就可以緩存到你的重定向所在的位置。

我建議你刪除mod_alias RedirectMatch指令並將其替換爲重寫規則。有時,將兩個模塊組合在一起並使它們都影響單個URI可能會導致意想不到的結果。所以上述所有的規則之前,你必須:

RewriteRule ^Shop/(.*)$ /$1 [L] 

中添加特殊字符鏈中去除/Shop/。那麼你的最後一條規則將遵循:

RewriteCond %{REQUEST_URI} [A-Z] 
RewriteCond %{REQUEST_FILENAME} !\.(?:png|gif|ico|swf|jpg|jpeg|js|css|php|pdf)$ 
RewriteRule (.*) ${lc:http://www.mysite.com/$1} [R=301,L] 
+0

見我原來的職位,我已經編輯它顯示我在我的.htaccess文件。現在,有些 - 儘管不是全部 - 網址在新軟件中,從mysite.com/parent-category/sub-category/baby-category/到mysite.com/../sub-category/baby-category/。如果我將新的htaccess文件還原爲原始版本,則不會發生這種情況,所以它肯定是由htaccess規則集引起的。任何想法爲什麼? –

+0

你好。我想消除http://www.s--.com/final-cut-pro/no-quartz-extreme0-vram/"<「 virtualsets