我正在尝试使用 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 应用程序处理此问题的方式。