一個系列網站從drupal 6升級到drupal 7後日志中發現大量報錯,都是以前可以正常訪問的網址現在找不到了,發現以前drupal 6中是這樣的:
http://ut.mingluji.com/business_directory/Western_Heating_%2526_Air_Conditioning
在google搜索中也是上面這樣的網址,但升級後以上訪問成了404 not found,而用下面這樣的網址可以訪問:
http://ut.mingluji.com/business_directory/Western_Heating_%26_Air_Conditioning
對比發現少了一個25,為了兼容起來還需要在.htaccess中寫一個Apache ReWrite規則來實現老網址301重定向跳轉到新網址,按理說這個跳轉非常簡單的,但那個%2526的寫法卻總是不被apache識别,和同事嘗試了好幾個小時才最終搞定:
RewriteCond %{REQUEST_URI} ^(.*)\%26(.*)$ RewriteRule ^(.*)\%26(.*)$ $1\%26$2 [NE,L,R=301]
要點有兩個:
- %百分号後面不需要也不能加25,否則就識别不出來了,隻能寫%26才可以識别出%2526;
- 替換結果中總是自動出現%25,直到加了NE(‘noescape|NE’,在輸出中不對URI進行轉義)才不會出現這個25
翻看以前的博客文章《Drupal的Pathauto模塊生成帶有單引号、雙引号、反斜杠URL問題及解決》、《Drupal_7的URL中+加号、&符号的編碼問題及解決》,當時也遇到網址中特殊符号轉義的問題,通過修改drupal 6的核心文件來解決,但這樣可能留下隐患,影響drupal 6的小版本升級以及到drupal 7的大版本升級。
另外還找到一篇《Apache中設置屏蔽IP地址和URL網址來禁止采集》,看到.htaccess中有這樣寫的:
RewriteCond %{HTTP_HOST} ^can\.bizdirlib\.com(.*)$ RewriteCond %{REQUEST_URI} ^\/business_directory\/S\_\%26\_J(.*)$ RewriteRule .* - [F,L]
其中也包含%26,我記得當時是為了屏蔽反複抓取某個網址采取的屏蔽措施,當時也是花了好些時間來改這個正則才實現的,隻是時間太久,忘記以前的情況了,當時應該也是為了屏蔽%2526這樣的。
2016年3月28日補充:如果手機版中帶有%26網址的頁面報錯,可以這樣改:
# drupal 6 to drupal 7 from %2526 to %26 RewriteCond %{REQUEST_URI} ^\/m\/ RewriteCond %{REQUEST_URI} ^(.*)\&(.*)$ RewriteRule ^(.*)$ %1\%2526%2 [NE,L] RewriteCond %{REQUEST_URI} !^\/m\/ RewriteCond %{REQUEST_URI} ^(.*)\%26(.*)$ RewriteRule ^(.*)\%26(.*)$ $1\%26$2 [NE,L,R=301]
如果網址中帶有兩個、多個%26的情況,在手機版中還需要這樣處理:
# drupal 6 to drupal 7 from %2526 to %26 RewriteCond %{REQUEST_URI} ^\/m\/ RewriteCond %{REQUEST_URI} ^(.*)\&(.*)\&(.*)\&(.*)$ RewriteRule ^(.*)$ %1\%2526%2\%2526%3\%2526%4 [NE,L] RewriteCond %{REQUEST_URI} ^\/m\/ RewriteCond %{REQUEST_URI} ^(.*)\&(.*)\&(.*)$ RewriteRule ^(.*)$ %1\%2526%2\%2526%3 [NE,L] RewriteCond %{REQUEST_URI} ^\/m\/ RewriteCond %{REQUEST_URI} ^(.*)\&(.*)$ RewriteRule ^(.*)$ %1\%2526%2 [NE,L] RewriteCond %{REQUEST_URI} !^\/m\/ RewriteCond %{REQUEST_URI} ^(.*)\%26(.*)$ RewriteRule ^(.*)\%26(.*)$ $1\%26$2 [NE,L,R=301]
评论