rewriterule [B] Backrefrence Flag

时间:2015-07-01 19:36:51

标签: php apache .htaccess mod-rewrite

我想在php中使用一段代码来了解B标志的工作原理。

我的htaccess文件位置是Applications / AMPPS / www / h或localhost / h 有以下代码

RewriteRule search/(.*)$ /search.php?$1 [R,QSA,B]

当我点击网址时localhost/h/search/x & y/z 与B旗我得到了这个:localhost/search.php?x+%2526+y%252fz 没有B标志我得到了这个:http://localhost/search.php?x%20&%20y/z

现在,如果我使用php的字符串x & y/z的urlencode,那么x+%26+y%2Fz会将+替换为B标志,而&则替换%2526 B标志提供类似%26的输出,urlencode提供x%2B%2526%2By%252Fz,当我再次对编码输出重新编码时,变为类似:%26,是,将%2526编码为{{ 1}}但编码+所以在这两种情况下,它都不会这样做,B确实如此。我需要像B那样匹配它。

此外,我可以找出哪些可能的字符(可能有一个列表),我可以找出B可以编码哪些非字母数字字符,以及如果我试图从php的前瞻性中理解B如何对它们进行编码

1 个答案:

答案 0 :(得分:1)

<style type="text/css"> #height { width: 200px; } #height option { width: 500px; height:200px !important; } </style> <select id="height"> <option value="bugatti">Bugatti</option> <option value="lamborghini">Lamborghini</option> <option value="ferrari">Ferrari</option> <option value="levis">Levis</option> <option value="reebok">Reebok</option> <option value="nike">Nike</option> </select> 将编码所有非字母数字字符。因此,除了36(A-Z 0-9)或62(A-Z a-z 0-9)字母数字字符之外的每个字符都将被转义。

首先,为什么需要[B] flag?正如您所说,网址中的字符串[B] flag会导致x & y/z无效,因为x%20&%20y/zreserved characters in URL's even after percent encoding之一。

所以&只会在PHP中为您提供x%20&%20y/z

所以现在你需要旗帜。让我们分析它对您的示例字符串的作用:

x

这将导致PHP中出现x & y/z x%20&%20y/z // encode all spaces (%20) x%20%26%20y%2Fz // encode the & (%26) and / (%2F)

您可能感到困惑的是,您在浏览器中看不到正确的编码。

让我们分析一下您x & y/z使用x+%2526+y%252fz的原因:

[R] flag被编码为&如果您再次对此进行编码,%26将被编码为%,结果将为%25。但为什么两个特殊(保留)字符都被编码两次?

这是因为重写模块首先对特殊字符进行编码,然后默认编码所有内容。

如果要取消此操作,可以使用%2526标记。

获取[NE]代替+的行为似乎是使用%20[B]的副作用,因为如果您仅使用这种情况就不会发生[R]

要回答您的问题:[R]PHP's rawurlencode的内容相同。