查询字符串未在更深层次的目录上重定向
Query string not redirected on deeper level directories
我想通过附加字符串将带有查询字符串的每个 link 重定向到特定地址。我的 WordPress .htaccess
:
中有以下内容
RewriteEngine On
RewriteCond %{QUERY_STRING} catid=([0-9]+) [NC]
RewriteRule (.*) catid%1? [R=301,L]
当用户点击 example.com/?catid=10
时,他们被成功重定向到 example.com/catid10
,这就是我想要的。
但是,当他们进入更深的目录 (example.com/category/?catid=10
) 时,他们不会被重定向到 example.com/category/catid10
。
我一直在阅读手册,但找不到答案。
编辑
如果这有帮助,这是 WordPress 在我的 htaccess 中定义的内容:
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
您只需使用 </code> 将 <code>(.*)
中捕获的组添加到您的重定向目标。我会把它分成几条规则,这样你就不会得到重复的斜线。我不会用问号结束重写目标,而是将 QSD
(查询字符串丢弃)标志添加到规则中。我还会添加以 (^
) 开头并以 ($
) 结尾的规则以重写规则,以便您始终匹配整个规则。我还喜欢用可选的斜杠 (/?
) 开始我的规则,这样规则就可以在 .htaccess 和 apache conf 中使用。
RewriteEngine On
# Home URL with catid query string
RewriteCond %{QUERY_STRING} catid=([0-9]+) [NC]
RewriteRule ^/?$ /catid%1 [R=301,L,QSD]
# Deep URL ending in slash with a catid query string
RewriteCond %{QUERY_STRING} catid=([0-9]+) [NC]
RewriteRule ^/?(.*)/$ //catid%1 [R=301,L,QSD]
# Deep URL not ending in slash with a cadid query string
RewriteCond %{QUERY_STRING} catid=([0-9]+) [NC]
RewriteRule ^/?(.*)$ //catid%1 [R=301,L,QSD]
提供 RewriteBase /
已经定义(它通常与 WordPress 一起使用,并且如果您现有的重定向正在工作则必须如此)然后您可以像下面这样使用一个规则来完成它:
RewriteCond %{QUERY_STRING} (?:^|&)catid=(\d+) [NC]
RewriteRule (.*?)/?$ /catid%1 [QSD,R=301,L]
捕获组 (.*?)
是非贪婪的,因此不会消耗后面的可选尾部斜杠。
对文档根的请求不需要 RewriteBase
,但所有“更深层次的”URL 都需要,因为生成的 替换 字符串否则将是一个亲戚 URL.
CondPattern 上的非捕获 (?:^|&)
前缀确保它只匹配 URL 参数名称 catid
而不是 foocatid
等
我想通过附加字符串将带有查询字符串的每个 link 重定向到特定地址。我的 WordPress .htaccess
:
RewriteEngine On
RewriteCond %{QUERY_STRING} catid=([0-9]+) [NC]
RewriteRule (.*) catid%1? [R=301,L]
当用户点击 example.com/?catid=10
时,他们被成功重定向到 example.com/catid10
,这就是我想要的。
但是,当他们进入更深的目录 (example.com/category/?catid=10
) 时,他们不会被重定向到 example.com/category/catid10
。
我一直在阅读手册,但找不到答案。
编辑
如果这有帮助,这是 WordPress 在我的 htaccess 中定义的内容:
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
您只需使用 </code> 将 <code>(.*)
中捕获的组添加到您的重定向目标。我会把它分成几条规则,这样你就不会得到重复的斜线。我不会用问号结束重写目标,而是将 QSD
(查询字符串丢弃)标志添加到规则中。我还会添加以 (^
) 开头并以 ($
) 结尾的规则以重写规则,以便您始终匹配整个规则。我还喜欢用可选的斜杠 (/?
) 开始我的规则,这样规则就可以在 .htaccess 和 apache conf 中使用。
RewriteEngine On
# Home URL with catid query string
RewriteCond %{QUERY_STRING} catid=([0-9]+) [NC]
RewriteRule ^/?$ /catid%1 [R=301,L,QSD]
# Deep URL ending in slash with a catid query string
RewriteCond %{QUERY_STRING} catid=([0-9]+) [NC]
RewriteRule ^/?(.*)/$ //catid%1 [R=301,L,QSD]
# Deep URL not ending in slash with a cadid query string
RewriteCond %{QUERY_STRING} catid=([0-9]+) [NC]
RewriteRule ^/?(.*)$ //catid%1 [R=301,L,QSD]
提供 RewriteBase /
已经定义(它通常与 WordPress 一起使用,并且如果您现有的重定向正在工作则必须如此)然后您可以像下面这样使用一个规则来完成它:
RewriteCond %{QUERY_STRING} (?:^|&)catid=(\d+) [NC]
RewriteRule (.*?)/?$ /catid%1 [QSD,R=301,L]
捕获组 (.*?)
是非贪婪的,因此不会消耗后面的可选尾部斜杠。
对文档根的请求不需要 RewriteBase
,但所有“更深层次的”URL 都需要,因为生成的 替换 字符串否则将是一个亲戚 URL.
CondPattern 上的非捕获 (?:^|&)
前缀确保它只匹配 URL 参数名称 catid
而不是 foocatid
等