我在 .htaccess 中有以下重寫規則:-
RewriteRule ^.*/-y.* /handleurl.php [L]
其目的是根據 url 中的值顯示適當的頁面,例如:
example.com/books/BookA/-y?act=x 將顯示 bookA 頁面
保存書名的變數被編碼為......
example.com/books/Book B/-y?act=x變成example.com/books/book B/-y?act=x
...很好(在 中解碼handleurl.php)
但是,如果這本書被稱為Book A/B我有...
example.com/books/Book A/B/-y?act=x 變成 example.com/books/Book A/B/-y?act=x
似乎 htaccess 在重寫規則之前對其進行解碼,因此重寫規則在由/.
有什么辦法可以讓重寫規則/按預期忽略編碼?
我看過之前對類似問題的回答,但我只需要/忽略 ,而不是其他編碼字符。
uj5u.com熱心網友回復:
似乎 htaccess 在重寫規則之前對此進行了解碼,因此重寫規則在由
/
這不是問題。無論 URL-path 是否/books/Book A/B/-y被解碼,這里都沒有區別*1。雙方將匹配(而大方)正則運算式^.*/-y.*的RewriteRule 模式。
(*1但是是的,RewriteRule 模式匹配的 URL-path是 URL 解碼的,即 %-decoded。)
問題很可能是 Apache(默認情況下)拒絕 - 使用 404 - 任何包含 % 編碼斜杠的 URL,即。/(或反斜杠\)在 URL 的 URL-path 部分。這是一項安全功能,否則“可能會允許不安全的路徑”(來源)。
但是,這可以被AllowEncodedSlashes指令覆寫。但是該指令只能在服務器或虛擬主機背景關系中使用。它不能用于.htaccess.
您要么需要設定AllowEncodedSlashes On為允許編碼斜杠,這些斜杠也被解碼,與其他字符一樣。或者設定AllowEncodedSlashes NoDecode為允許編碼斜杠,但不解碼它們 - 這是首選,可能是您所期望的。
旁白#1:
RewriteRule ^.*/-y.* /handleurl.php [L]
正則運算式^.*/-y.*非常通用,可能太通用了。這與簡單地相同/-y。什么是.*后-y一種旨在匹配?從您的示例 URL 看來,-y它始終位于 URL 路徑的末尾,因此可以將其錨定,例如。/-y$. 如果您需要匹配的 URL 總是開始,/books/那么也許這也應該包含在正則運算式中?
旁白#2:
...書名的編碼方式是...
example.com/books/Book B/-y?act=x變成example.com/books/book B/-y?act=x......這很好(它在handleurl.php中解碼)
這不是嚴格的“URL編碼”,你已經轉換了空間為 在URL路徑。該 是一個有效的“URL編碼”的空間僅在查詢字串時。 URL-path 中的A是一個文字 (并且會被搜索引擎看到)。在 URL 路徑中,空格將被 URL 編碼為 . (您可能使用了錯誤的 PHP 編碼函式,例如。urlencode()而不是rawurlencode()?)
當然,您可以自由地轉換/編碼 URL,但是您希望創建一個更具可讀性的 URL - 只要它是有效的。
uj5u.com熱心網友回復:
重寫規則從來都不是問題。我認為這是 Apache 不喜歡編碼的“/”以及下游 url 處理程式在識別單個 url 元素時使用“/”作為分隔符的事實。我必須解決:1) 我是否想在構成友好 url 元素的變數中允許 '/',以及 2) 如果是這樣,如何在不打擾 Apache 的情況下傳遞它,以及如何隨后決議 url。也許我會為了 URL 的利益將 '/' 轉換為 '~',然后在后續顯示之前轉換回 '/'。謝謝白先生。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/372981.html
