apache的RewriteMap使用心得

2021-04-26 07:56:40 字數 1378 閱讀 9116

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

原來的url

轉換後的url

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

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

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

rewritemap escape int:escape

rewriterule ^/([^/]*)$ /newpage.php?mi_url_suffix=$} [l,pt]

注:這裡的int不是intger的意思,它是internal的縮寫,表示呼叫內部函式。

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

接著細看apache的rewrite手冊,發現rewritemap還支援自定義指令碼,那麼還得使出俺的看家絕技——php了。首先弄乙個能轉義的php,必須非常簡單,複雜了apache容易掛掉,寫出來發現想複雜都挺難啊:

/usr/local/bin/escape.php

ig:syntax hiliter » plain-text viewbody

#!/usr/bin/php -f

<?php

while($in = trim(fgets(stdin)))

fputs(stdout, urlencode($in) . "/r/n");

?>

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

rewritemap escape prg:/usr/local/bin/escape.php

rewriterule ^/([^/]*)$ /newpage.php?mi_url_suffix=$} [l,pt]

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

APACHE優化之apache的記憶體使用

keepalive引數 keepalivetimeout這個引數決定了,在什麼都不做之前,乙個http程序能夠等待多長時間?設想一下,如果keepalive設定為on,而keepalivetimeout設定為乙個比較大的數字,apache占用記憶體會很快的增長。這是因為,乙個apache程序完成了乙...

Apache服務(三)Apache服務支援的語言

1.html 預設支援的語言 2.php 1 編輯php的預設測試頁 退出儲存後開啟瀏覽器檢視什麼都檢視不到 2 yum install php y 安裝php軟體 systemctl restart httpd 重啟服務 再次檢視可以檢視到藍色頁面 註冊的介面cgi 普通閘道器介面 網路的語言裝換...

Apache文件手冊 安裝Apache

安裝 在linux或unix環境下安裝 必需條件 將檔案解壓到某個目錄,例如 srclib apr 和 srclib apr util 2 pcre庫 這是httpd必需的模組 3 磁碟空間 至少50m臨時空間 4 ansi c編譯器和構建環境 5 精確的時間設定,使用ntpdate或者xntpd程...