.htaccess替换url参数“name”

时间:2017-07-27 19:16:17

标签: .htaccess mod-rewrite

我有一个类似

的网址
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]

1 个答案:

答案 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路径上设置了尾随斜杠可选。这真的是可选的吗?如果是,那么您应该确保在替换中规范化。在下面的代码中,我假设尾部斜杠是必需的,因为它存在于您的示例中。

根据您的具体示例,您还需要RewriteCondNE)标志,以防止查询字符串中的%编码空格(即noescape)被双重编码。< / p>

所以,将这些点组合在一起,尝试以下内容:

%20

请注意,这是临时(302)重定向。仅当您确定其正常工作时才将RewriteCond %{QUERY_STRING} (^|.+&)name=(.*) RewriteRule ^pokladna/$ /$0?%1name_gls=%2 [NE,R,L] 更改为R。永久重定向可能会使测试成为问题,因为浏览器会对其进行高速缓存。

因此,您需要确保在测试之前清除浏览器缓存。

并且,如上所述,这些必须在之前现有的WordPress指令(特别是之前前控制器)。