我想在我的網站上使用花哨的URL作爲標記過濾器。網址應該看起來像http://example.com/source/+tag1+tag2。這應該篩選標籤tag1和tag2的所有項目。我想出了,下面的重寫規則,這是我保存在站點的根目錄:Apache重寫吃掉了一個級別的轉義(%23)
RewriteRule ^([^+]+)(\+.+)$ $1?tags=$2 [L]
也能正常工作的所有普通的標籤名字,但它失敗的標籤名稱爲「C#」。我知道散列字符不會發送到服務器,因此標記名稱是url編碼的,HTML頁面中的鏈接如下所示:./+c%23
但目標頁面只能在其tags參數中看到「c」,休息和「#」之後的任何東西都不在了。
我已啓用Apache的重寫日誌記錄,並看到它已記錄傳入的URL請求,如…/+c#
。這使我認爲可能需要另一級別的轉義。所以我嘗試了%2523,它實際上已經成功地通過了重寫,而整個字符串「c#」出現在我的頁面中。
但是,當我訪問其內部URL如./?tags=c%23
的頁面時,它也已經有效。那麼爲什麼Apache吃掉了一個級別的轉義?是否有隱藏的重寫標誌可以用來避免這種情況?我是否需要使用雙重編碼的公共URL才能工作?或者它會太亂,我應該改爲將我的標籤重命名爲「csharp」?
我想你需要http://httpd.apache.org/docs/current/rewrite/flags.html#flag_b(所以' [L,B]') – Gerben 2012-02-21 21:31:10
好點,但它似乎沒有工作。重寫日誌說:重寫'de/source/+ c#' - >'de%2fsource%2f?tags =%2bc%23'然後得到的URL不能被找到。它逃避的方式太多了。只有「#」應該被重新轉義,而不是URL路徑的所有其他重要部分。 – ygoe 2012-02-21 21:51:17
解決。我需要在頁面的目錄中創建另一個.htaccess文件以避免所有的「/」轉義。您能否將您的評論添加爲答案,以便我可以接受它? :) – ygoe 2012-02-21 21:55:31