【问题标题】:URL Decoded Prior to htaccess Rewrite Rule在 htaccess 重写规则之前解码的 URL
【发布时间】:2022-01-10 01:08:47
【问题描述】:

我在 .htaccess 中有以下重写规则:-

RewriteRule ^.*/-y.* /handleurl.php [L]

其目的是根据url中的值显示合适的页面,例如:

example.com/books/BookA/-y?act=x 将显示 bookA 页面

保存书名的变量被编码为 ...

example.com/books/Book B/-y?act=x 变为 example.com/books/book+B/-y?act=x ...这很好(它在handleurl.php中解码)

但是,如果这本书被称为 Book A/B 我有...

example.com/books/Book A/B/-y?act=x 变成 example.com/books/Book+A%2FB/-y?act=x

似乎 htaccess 在重写规则之前对此进行了解码,因此重写规则在由/ 描绘的 URL 中看到了太多元素。

有什么方法可以让重写规则按预期忽略编码的/

我已经看到之前对类似问题的回复,但我只需要忽略 /,而不需要其他编码字符。

【问题讨论】:

    标签: php apache .htaccess mod-rewrite


    【解决方案1】:

    重写规则从来都不是问题。我认为这是 Apache 不喜欢编码的“/”,以及下游 url 处理程序在识别单个 url 元素时使用“/”作为分隔符的事实。我必须解决:1)我是否要在构成友好 url 元素的变量中允许 '/',以及 2)如果是这样,如何在不扰乱 Apache 的情况下传递它以及如何随后剖析 url。也许我会为了 URL 的利益将“/”转换为“~”,然后在后续显示之前转换回“/”。谢谢白先生。

    【讨论】:

      【解决方案2】:

      似乎 htaccess 在重写规则之前对此进行了解码,因此重写规则在由/ 描绘的 URL 中看到了太多元素

      这不是问题。无论 URL-path /books/Book+A%2FB/-y 是否被解码在这里都没有区别*1。两者都将匹配RewriteRule 中的(相当慷慨的)正则表达式^.*/-y.* 模式

      (*1 但是是的,RewriteRulepattern 匹配的 URL-path 是 URL 解码的,即 %-decoded。)支持>

      问题可能是 Apache(默认情况下)拒绝 - 使用 404 - 任何包含 % 编码斜杠的 URL,即。 URL 的 URL 路径部分中的 %2F(或反斜杠 %5C)。这是一个安全功能,否则“可能会允许不安全的路径”(source)。

      但是,这可以被AllowEncodedSlashes 指令覆盖。但是这个指令只能在 servervirtualhost 上下文中使用。不能用于.htaccess

      您需要设置AllowEncodedSlashes On 以允许编码斜线,斜线也被解码,与其他字符一样。或设置 AllowEncodedSlashes NoDecode 以允许编码斜线,但不要解码它们 - 这是首选,可能是您所期望的。


      除了#1:

      RewriteRule ^.*/-y.* /handleurl.php [L]
      

      正则表达式^.*/-y.* 非常通用,可能太通用了。这与简单的/-y 相同。 -y 之后的 .* 打算匹配什么?从您的示例 URL 看来,-y 始终位于 URL 路径的末尾,因此可以将其锚定,例如。 /-y$。如果您需要匹配的 URL 始终以 /books/ 开头,那么也许这也应该包含在正则表达式中?


      除了#2:

      ...书名被编码为...

      example.com/books/Book B/-y?act=x 变为 example.com/books/book+B/-y?act=x ...这很好(在 handleurl.php 中解码)

      这不是严格的“URL 编码”,您已在 URL 路径中将 空格转换++ 仅在查询字符串中使用时是 空格 的有效“URL 编码”。 URL 路径中的+ 是文字+(并且会被搜索引擎看到)。在 URL 路径中,空格 将被 URL 编码为%20。 (您可能使用了错误的 PHP 编码函数,例如 urlencode() 而不是 rawurlencode()?)

      当然,您可以随意转换/编码 URL,但是您希望创建一个更易读的 URL - 只要它是有效的。

      【讨论】:

      • 怀特先生,谢谢。我显然是在叫错树。我收到的 Not Found [url] 消息是我认为的,因为 Apache 不喜欢 / 的编码。我取出那一点编码并且它可以工作(尽管下一个程序因附加 / 而失败 - 但这是由于我现在可以修复的糟糕设计。我还将尝试根据您的笔记改进简化重写规则。
      猜你喜欢
      • 1970-01-01
      • 2011-12-06
      • 2016-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多