我正在尝试使用 mod_rewrite 创建一个 restful 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
和NE
标志,但它们没有任何效果。我想作为一种黑客手段,我可以将全部+
字符转换为_
和全部转换/
为-
,或者甚至可以对其进行双重 URL 编码,但我想知道是否有更好的方法。
答案1
您不需要。Web 服务器可以在应用重写规则之前解码未解码为特殊字符的百分比编码字符,并且可以在将数据传递给 Web 应用程序之前解码其余的百分比编码字符。(请参阅 RFC 3986。)
您应该做的是将前端控制器模式应用于 Web 应用程序中,并自行处理所有百分比解码(和请求路由)。在这种情况下,您只需将所有与文件或目录不匹配的请求重定向到,/index.php
然后从中读取 URL $_SERVER['REQUEST_URI']
。这就是 WordPress 和 MediaWiki 等主要基于 PHP 的 Web 应用程序处理此问题的方式。