htaccess重写规则,带有查询字符串、多个变量且链接中没有php文件

htaccess重写规则,带有查询字符串、多个变量且链接中没有php文件,php,apache,.htaccess,mod-rewrite,Php,Apache,.htaccess,Mod Rewrite,我们正在尝试将我们的论坛迁移到另一个平台,我们遇到了在其中包含查询的链接,例如 必须指出的是 因此,原始链接的逻辑结构是: http://{forum_base_url}/threads/{thread-id}-{thread-permalink}?p={post-id}&viewfull={post-number-in-thread}#post{post-id} 而新的是: http://{forum_base_url}/threads/{thread-permalink}.{th

我们正在尝试将我们的论坛迁移到另一个平台,我们遇到了在其中包含查询的链接,例如

必须指出的是

因此,原始链接的逻辑结构是:

http://{forum_base_url}/threads/{thread-id}-{thread-permalink}?p={post-id}&viewfull={post-number-in-thread}#post{post-id}
而新的是:

http://{forum_base_url}/threads/{thread-permalink}.{thread-id}/#post-{post-id}
因此,为了使重写生效,我们需要从原始链接中“提取”三个内容:线程id、永久链接和post-id。前两个不是问题,而是第三个不想合作的内容

在搜索互联网寻找可能的解决方案后,我们提出了:

RewriteCond %{QUERY_STRING} ^p=(\d+)&viewfull=(\d+)#post(\d+)$
RewriteRule ^threads/([0-9]+)-(.*)$ /threads/$2\.$1/#post-%1? [R=301,NC,L]
但不幸的是,重写不起作用

让我们对重写感到不安的是,查询中有多个变量,链接本身没有指定.php文件,因此我们不能仅使用此处提供的解决方案:

关于如何克服这一特殊障碍的任何提示?

URL的
#post-
部分永远不会发送到服务器,它完全保留在浏览器端,因此无法与之匹配。幸运的是,帖子ID已经在查询字符串中,因此您可以忽略它:

RewriteCond %{QUERY_STRING} ^p=(\d+)&viewfull=(\d+)$
RewriteRule ^threads/([0-9]+)-(.*)$ /threads/$2\.$1/#post-%1? [R=301,NC,L]

另一件事是线程permalink在第二个URL中是小写的。不确定这是否重要,但要将文本更改为小写,需要使用a和
tolower
内部函数。您只能在服务器vhost/config中声明映射,因此如果您没有访问这些配置文件的权限,您将无法使用映射。

感谢您清除了#post-aspect

我尝试了您的修改,但最初链接变成:

为了工作,需要重新编写

RewriteCond %{QUERY_STRING} ^p=(\d+)&viewfull=(\d+)$
RewriteRule ^threads/([0-9]+)-(.*)$ /threads/$2\.$1/#post-%1? [R=301,NC,NE,L]
请注意末尾的附加NE(noscape)标志


这是因为,在默认情况下,特殊字符(如&和?)将转换为其等效的十六进制代码。使用[NE]标志可以防止这种情况发生,如下所示:

URL的哈希部分不是查询字符串的一部分。(甚至不发送到服务器。)