程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> Apache服務器的RewriteMap

Apache服務器的RewriteMap

編輯:PHP綜合

在apache的環境下,rewrite還真是生活之友啊,時不時就得用上。前些日子有個需求,要將url重新轉一轉。

什麼情況?

原來的url
http://www.xxx.com/demo/oldpage.PHP?param1=1&param2=2

轉換後的url
http://www.xxx.com/newpage.php?url=%2Fdemo%2Fmypage.PHP%3Fparam1%3D1&param2%3D2

需要把粗體部分的url進行urlencode,能看出上面的字符"?&="都分別轉義過,作為參數發給另外一個url。那麼這時候請出rewrite還真是最合適不過了。

坎坷的Rewrite經歷

查查rewrite手冊,俺這才知道,轉義這活,非得派出RewriteMap的map function才能做的比較漂亮。現在只有四個內部map function可供差遣:

  • toupper: Converts the key to all upper case.
  • tolower:
  • Converts the key to all lower case.
  • escape: Translates special characters in the key to hex-encodings.
  • unescape: Translates hex-encodings in the key back to special characters.

那麼很快就有了第一個rewrite出現:

RewriteMap escape int:escape
RewriteRule ^/([^/]*)$ /newpage.PHP?mi_url_suffix=${escape:$1?%{QUERY_STRING}} [L,PT]

注:這裡的int不是intger的意思,它是internal的縮寫,表示調用內部函數。

看上去非常簡單,跑起來貌似也正....常?且慢,俺打開RewriteLog一瞅,形式不容樂觀啊,"&"字符通通沒有轉義。看來是失敗了,爬到狗狗上翻了一下,貌似escape對"?="之類的特殊字符是不做轉義的,暈。

RewriteMap到底

接著細看apache的rewrite手冊,發現RewriteMap還支持自定義腳本,那麼還得使出俺的看家絕技——php了。首先弄一個能轉義的PHP,必須非常簡單,復雜了apache容易掛掉,寫出來發現想復雜都挺難啊:

/usr/local/bin/escape.PHP

PHP:
  1. #!/usr/bin/PHP -f
  2. <?PHP
  3. while($in = trim(fgets(STDIN)))
  4.         fputs(STDOUT, urlencode($in) . "\r\n");
  5. ?>

在這個腳本裡可別使用php:://stdin之類的,具體原因查PHP手冊。相應的,rewrite規則如下:

RewriteMap escape prg:/usr/local/bin/escape.PHP
RewriteRule ^/([^/]*)$ /newpage.PHP?mi_url_suffix=${escape:$1?%{QUERY_STRING}} [L,PT]

rewrite規則沒有太大的改變,prg表示使用自定義腳本。現在這個版本總算正常運作了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved