如何防止 mod_rewrite 解码路径中的字符串?

Mik*_*ike 1 php mod-rewrite rewrite encoding apache-2.2

我正在尝试使用 mod_rewrite 创建一个宁静的 API。

我有一个规则:

RewriteRule v2/(.*)$ v1/index.php?request=$1 [QSA,NC,L]
Run Code Online (Sandbox Code Playgroud)

然而,路径可能包含 base64 编码的字符串(即可以有 + 或 /)并且它们在到达 PHP 之前被解码。

例如,如果我去

/v2/cards/9VwQLli%2Bf0ogFl19AVRFLuztbp8cP0rYCgXBu3H9%2BDc%3DBe
Run Code Online (Sandbox Code Playgroud)

PHP 获取$_REQUEST['request']cards/9VwQLli f0ogFl19AVRFLuztbp8cP0rYCgXBu3H9 Dc=Be'.

更糟糕的是,如果我在其中添加斜杠(例如9VwQLli%2Bf0ogFl19AVRFLuztbp8c%2FP0rYCgXBu3H9%2BDc%3DBe-%2F是斜杠),我会得到 404。

我怎样才能防止这种情况发生?

注意:我尝试了BNE标志,但它们没有任何效果。我想作为一个黑客,我可以将所有+字符_都转换/-,或者甚至是双 url 编码,但我想知道是否有更好的方法。

Mic*_*ton 6

你没有。允许 Web 服务器在应用重写规则之前解码未解码为特殊字符的百分比编码字符,并允许在将数据传递到 Web 应用程序之前解码剩余的百分比编码字符。(参见 RFC 3986。)

您应该做的是在您的 Web 应用程序中应用前端控制器模式,并自己处理所有百分比解码(和请求路由)。在这种情况下,你会简单地重定向没有一个文件或目录匹配的所有请求/index.php,然后读取URL出$_SERVER['REQUEST_URI']。这就是主要的基于 PHP 的 Web 应用程序(如 WordPress 和 MediaWiki)处理此问题的方式。