【问题标题】:Using or ( | ) statement in .htaccess rewrite rules在 .htaccess 重写规则中使用 or (|) 语句
【发布时间】:2013-05-18 21:42:15
【问题描述】:

虽然我可以使用 Or 语句 ( | ) 使用一条规则来执行此操作,但我无需编写 2 条重写规则来指向同一页面:

RewriteRule ^([\d]+)-post[\d]*\.html|#post([\d]+) /post.php?p=$1.html    [R=301,NC,L]

最后还尝试了额外的 2 美元,因为无论如何只会出现一个:

RewriteRule ^([\d]+)-post[\d]*\.html|#post([\d]+) /post.php?p=$1$2.html    [R=301,NC,L]

使用上述规则,这将正常工作:

site.com/14729-post9.html

但是,这不起作用(即使在这里测试并且应该可以工作:http://regexpal.com/):

site.com/post.php?p=14729#post14729

真的有办法让它工作还是我只需要创建 2 个单独的规则?

顺便说一句,服务器密集度是一种方式还是另一种方式?

【问题讨论】:

    标签: regex .htaccess url mod-rewrite url-rewriting


    【解决方案1】:

    好的,因此您必须了解,诸如#post14729 之类的文档内命名链接永远不会由浏览器传递给服务器。当链接包含名为链接的文档内时,例如:假设您单击<a href='http://some.host.com/foo.php?id=1&bar=2#post250'>some link</a>。在这里,浏览器在将 GET 发送到 some.host.com 时会去除 #post250 部分,并且只发送带有变量 id=1 和 bar=2 的 URL /foo.php。当 GET 的结果返回到浏览器时,它将在内容中搜索名为“#post250”的锚点,并在需要时滚动以使其可见。如果没有一些 javascript 技巧,就无法将“#post250”发送回浏览器。

    您的 RewriteEngine 根本没有真正看到您的“#post14729”。

    【讨论】:

      【解决方案2】:

      这里有一个主要问题。

      URL 的#post14729 部分称为URL Fragment,它从不发送到服务器,因此,您无法匹配它,因为它根本不存在。所以你的正则表达式的第二部分:#post([\d]+) 永远不会匹配。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-22
        • 1970-01-01
        • 1970-01-01
        • 2012-02-25
        • 2011-11-03
        • 1970-01-01
        相关资源
        最近更新 更多