0

虽然我可以使用 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 个单独的规则?

顺便说一句,一种方式或另一种方式更服务器密集?

4

2 回答 2

1

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

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

于 2013-05-18T21:57:33.843 回答
0

这里的一个主要问题。

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

于 2013-05-18T21:57:42.670 回答