【问题标题】:mod_rewrite: no ? and # in REQUEST_URImod_rewrite:没有?和 # 在 REQUEST_URI
【发布时间】:2011-03-03 10:32:09
【问题描述】:

我正在尝试做的事情: 具有“http://domain.tld/one/two/three”格式的漂亮 URL,由 PHP 脚本 (index.php) 通过查看 REQUEST_URI 服务器变量来处理。
在我的示例中,REQUEST_URI 将是“/one/two/three”。 (顺便说一句,这是一个好主意吗?)

我正在使用 Apache 的 mod_rewrite 来实现这一点。
这是我在 .htaccess 中使用的 RewriteRule:

重写规则 ^/?([a-zA-Z/]+)/?$ /index.php [NC,L]

到目前为止,这非常有效;它将每个由 a-z、A-Z 或“/”组成的 REQUEST_URI 转发到 /index.php,在那里进行处理。

唯一的缺点:'?' (问号)和“#”(哈希键)似乎仍然允许在 REQUEST_URI 中使用,甚至可能还有更多我还没有找到的字符。
是否可以通过我的 .htaccess 和对 RewriteRule 的充分补充来限制这些?

谢谢!

【问题讨论】:

    标签: php apache mod-rewrite


    【解决方案1】:

    片段标识符,例如#some-anchor,由浏览器控制,而不是服务器。需要 JavaScript 来重定向和删除它,尽管我不确定您为什么要这样做。

    [澄清后截断] 仅在查询字符串为空时重写:

    RewriteCond %{QUERY_STRING} ^$
    RewriteRule ^/?([a-zA-Z/]+)/?$ /index.php [NC,L]
    

    【讨论】:

    • 我明白了,让我们忘记 # 那么,这不是什么大问题,但是 '?'有点困扰我。有没有办法不重写包含“?”的 REQUEST_URI?有人提到(现在删除了他的答案)来检查一个空的QUERY_STRING,这听起来是个好主意但没有奏效,也许我做错了?我试过你的建议,但没有做任何事情。谢谢。
    • @tshabala ?在 index.php 的末尾删除查询字符串。我已经用信息更新了我的答案
    • @tshabala 当我发现你的意思时,我已经添加到我的答案中
    • 我认为我们已经到了那里,尽管这并不是我想要的。您的重写规则(和条件)从 REQUEST_URI 中删除了 QUERY_STRING,对吗?我想做的只是在 REQUEST_URI 不包含“?”时将 RE​​QUEST_URI 重写为 index.php (即没有 QUERY_STRING),因此当 REQUEST_URI 包含“?”时出现 404 错误页面。
    • @tshabala 我整理了我的答案并修改了重写。摆脱的唯一方法?正如 Gumbo 解释的那样,当它自己存在时是重定向,你不能用重写来做,因为查询字符串将为空。因此,您需要使用 PHP 进行重定向
    【解决方案2】:

    在 mod_rewrite 和 PHP 中,变量 REQUEST_URI 指的是两个 different part of the URI。在 mod_rewrite 中,%{REQUEST_URI} 包含当前的 URI 路径;在 PHP 中,$_SERVER['REQUEST_URI'] 包含 URI 路径和查询。但在这两种情况下,URI 片段作为 URI 的这一部分不会传输到服务器,而仅由客户端使用。

    因此,当请求 /one/two/three?foo#bar 时,mod_rewrite 的 %{REQUEST_URI} 包含 /one/two/three 而 PHP 的 $_SERVER['REQUEST_URI'] 包含 /one/two/three?foo

    【讨论】:

      【解决方案3】:

      如果我理解,您想禁止使用 of 吗?和 # 用于您的网站?

      你不应该这样做,因为:

      因此,如果您强制 Apache 拒绝包含问号的 url 请求,那么在 AdWords 中点击您的广告的人将只会看到 404 错误页面。

      让人们同时使用它们并没有什么不好。该案例是为了防止您的网站受到 XSS 攻击。

      顺便说一句。还有一个非常重要的符号 - 百分号 (%),用于编码特殊字符(如波兰或德国国家字母)

      【讨论】:

        【解决方案4】:

        $_SERVER['REQUEST_URI'] 变量将包含服务器在执行重写之前接收到的原始 REQUEST_URI。因此,从 REQUEST_URI 的属性中删除查询字符串部分是不可能的(据我早上所知),但是当您在脚本中处理 $_SERVER['REQUEST_URI'] 变量时,您自然可以选择删除它。

        如果您只想在未指定查询字符串时执行您的 RewriteRule,以下应该可以工作:

        RewriteCond %{QUERY_STRING} !^.+$
        RewriteRule ^/?([a-zA-Z/]+)/?$ /index.php [NC,L]
        

        请注意,这可能是有问题的,因为如果某个 URL 中意外有一个查询字符串被某人用来链接到您的网站,您的脚本将不会处理它(因为重写永远不会发生),所以他们会得到一个 404 响应(或任何情况),它可能不像您刚刚选择默默地忽略尾随信息那样用户友好。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-09-29
          • 1970-01-01
          • 2015-04-28
          • 2012-01-20
          • 1970-01-01
          • 1970-01-01
          • 2017-03-23
          • 2013-09-08
          相关资源
          最近更新 更多