我有一个类似
的网址http://example.com/shake/pokladna/?id=35601-JILOSRO&name=Jilo%20s.r.o.&address=Hrušková%202194&city=Sokolov&zipcode=35601
我想将该地址重定向到这些地址(我需要将“name”替换为“name_gls”)
http://example.com/shake/pokladna/?id=35601-JILOSRO&name_gls=Jilo%20s.r.o.&address=Hrušková%202194&city=Sokolov&zipcode=35601
这段代码好吗?
RewriteCond %{QUERY_STRING} (.*)&?name=(.*)? [NC]
RewriteRule ^pokladna/?$ $0?%1name_gls=%2 [R=301,L]
答案 0 :(得分:0)
ID
这很接近,但不太正确。如上所述,这些指令位于RewriteCond %{QUERY_STRING} (.*)&?name=(.*)? [NC]
RewriteRule ^pokladna/?$ $0?%1name_gls=%2 [R=301,L]
的WordPress .htaccess
文件中。这些指令需要在之前任何现有的WP指令(如果还没有)。
/shake/.htaccess
替换需要斜杠前缀才能在每个目录RewriteRule
文件中进行有效的外部重定向。就目前而言,.htaccess
反向引用排除了斜杠前缀,因此导致相对路径替换 - 在这种情况下,目录前缀被添加回来,导致无效的重定向。
另一个潜在问题是 CondPattern 中的可选 $0
,即。 &
中的&?
。在给定的示例URL上,这将正常工作,但是,由于前面的(.*)&?name=(.*)?
是 greedy ,这也将匹配以“name”结尾的任何查询字符串参数名称即可。例如,(.*)
形式的查询字符串将更改为id=123&anothername=foo
- 我怀疑这是可取的。解决这个问题的方法是使用交替,例如。 id=123&anothername_gls=foo
匹配查询字符串的开头或前一个URL参数(和param分隔符)。
我还会质疑在(^|.+&)
指令上使用NC
标志 - 这真的是一个不区分大小写的匹配吗?
你已经在URL路径上设置了尾随斜杠可选。这真的是可选的吗?如果是,那么您应该确保在替换中规范化。在下面的代码中,我假设尾部斜杠是必需的,因为它存在于您的示例中。
根据您的具体示例,您还需要RewriteCond
(NE
)标志,以防止查询字符串中的%编码空格(即noescape
)被双重编码。< / p>
所以,将这些点组合在一起,尝试以下内容:
%20
请注意,这是临时(302)重定向。仅当您确定其正常工作时才将RewriteCond %{QUERY_STRING} (^|.+&)name=(.*)
RewriteRule ^pokladna/$ /$0?%1name_gls=%2 [NE,R,L]
更改为R
。永久重定向可能会使测试成为问题,因为浏览器会对其进行高速缓存。
因此,您需要确保在测试之前清除浏览器缓存。
并且,如上所述,这些必须在之前现有的WordPress指令(特别是之前前控制器)。