你如何防止mod_rewrite解码path中的string?

我正在尝试使用mod_rewrite创build一个restful API。

我有规则:

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

然而,path可能包含base64编码的string(即可以有+或/),它们在PHP到达之前被解码。

例如,如果我去

 /v2/cards/9VwQLli%2Bf0ogFl19AVRFLuztbp8cP0rYCgXBu3H9%2BDc%3DBe 

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

而更糟的是,如果我在那里添加一个斜线(例如9VwQLli%2Bf0ogFl19AVRFLuztbp8c%2FP0rYCgXBu3H9%2BDc%3DBe%2F是斜杠),我得到一个404。

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

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

你没有。 允许Web服务器在应用重写规则之前解码百分比编码的字符,这些字符不会解码为特殊字符,并且可以在将数据传递到Web应用程序之前解码百分比编码字符的其余部分。 (请参阅RFC 3986)

你应该做的是在你的Web应用程序中应用前端控制器模式,并自己处理所有百分比解码(和请求路由)。 在这种情况下,您只需将不匹配文件或目录的所有请求redirect到/index.php ,然后从$_SERVER['REQUEST_URI']读取URL。 这就是WordPress和MediaWiki等主要的基于PHP的Web应用程序如何处理这个问题。