2012-02-21 51 views
1

我想在我的網站上使用花哨的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」?

+0

我想你需要http://httpd.apache.org/docs/current/rewrite/flags.html#flag_b(所以' [L,B]') – Gerben 2012-02-21 21:31:10

+0

好點,但它似乎沒有工作。重寫日誌說:重寫'de/source/+ c#' - >'de%2fsource%2f?tags =%2bc%23'然後得到的URL不能被找到。它逃避的方式太多了。只有「#」應該被重新轉義,而不是URL路徑的所有其他重要部分。 – ygoe 2012-02-21 21:51:17

+0

解決。我需要在頁面的目錄中創建另一個.htaccess文件以避免所有的「/」轉義。您能否將您的評論添加爲答案,以便我可以接受它? :) – ygoe 2012-02-21 21:55:31

回答

1

我認爲你需要的B flag(所以使用[L,B])

+1

這確實是我正在尋找的選項。但它會在重寫過程中轉義整個URL字符串,包括路徑分隔符(/)和我用於標記名稱分隔的加號字符(+)。由於其中存在%2F的文件(轉義爲/)不存在,因此我需要將.htaccess文件的該部分移動到目標頁面所在的目錄中。然後我可以使用我上面的重寫規則,只有[L,B]前綴。 – ygoe 2012-02-21 22:08:29