Apache-2.2

如何防止 mod_rewrite 解碼路徑中的字元串?

  • April 16, 2015

我正在嘗試使用 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。

我怎樣才能防止這種情況發生?

注意:我嘗試了BandNE標誌,但它們沒有任何效果。我想作為一個 hack,我可以將所有+字元_都轉換/-,或者甚至是雙 url 編碼,但我想知道是否有更好的方法。

你沒有。在應用重寫規則之前,允許 Web 伺服器解碼未解碼為特殊字元的百分比編碼字元,並允許在將數據傳遞到 Web 應用程序之前解碼剩餘的百分比編碼字元。(參見 RFC 3986。)

您應該做的是在您的 Web 應用程序中應用前端控制器模式,並自己處理所有百分比解碼(和請求路由)。在這種情況下,您只需將所有與文件或目錄不匹配的請求重定向到/index.php,然後從$_SERVER['REQUEST_URI']. 這就是 WordPress 和 MediaWiki 等主要的基於 PHP 的 Web 應用程序處理此問題的方式。

引用自:https://serverfault.com/questions/683107