Apache-2.2
如何防止 mod_rewrite 解碼路徑中的字元串?
我正在嘗試使用 mod_rewrite 創建一個寧靜的 API。
我有規則:
RewriteRule v2/(.*)$ v1/index.php?request=$1 [QSA,NC,L]
然而,路徑可能包含 base64 編碼的字元串(即可以有 + 或 /),並且它們在到達 PHP 之前被解碼。
例如,如果我去
/v2/cards/9VwQLli%2Bf0ogFl19AVRFLuztbp8cP0rYCgXBu3H9%2BDc%3DBe
PHP 獲取
$_REQUEST['request']
為cards/9VwQLli f0ogFl19AVRFLuztbp8cP0rYCgXBu3H9 Dc=Be'
.更糟糕的是,如果我在其中添加一個斜線(例如
9VwQLli%2Bf0ogFl19AVRFLuztbp8c%2FP0rYCgXBu3H9%2BDc%3DBe
-%2F
是斜線),我會得到 404。我怎樣才能防止這種情況發生?
注意:我嘗試了
B
andNE
標誌,但它們沒有任何效果。我想作為一個 hack,我可以將所有+
字元_
都轉換/
為-
,或者甚至是雙 url 編碼,但我想知道是否有更好的方法。
你沒有。在應用重寫規則之前,允許 Web 伺服器解碼未解碼為特殊字元的百分比編碼字元,並允許在將數據傳遞到 Web 應用程序之前解碼剩餘的百分比編碼字元。(參見 RFC 3986。)
您應該做的是在您的 Web 應用程序中應用前端控制器模式,並自己處理所有百分比解碼(和請求路由)。在這種情況下,您只需將所有與文件或目錄不匹配的請求重定向到
/index.php
,然後從$_SERVER['REQUEST_URI']
. 這就是 WordPress 和 MediaWiki 等主要的基於 PHP 的 Web 應用程序處理此問題的方式。