2017-07-27 51 views
1

我有一个会像的.htaccess替换URL参数“名称”

http://example.com/shake/pokladna/?id=35601-JILOSRO&name=Jilo%20s.r.o.&address=Hrušková%202194&city=Sokolov&zipcode=35601 

我想重定向地址,这些(我需要更换“名”与“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

你把这些代码放在哪里?网址参数是否有所不同? 'name'总是_internal_ URL参数吗?或者它也可能出现在查询字符串的开头? – MrWhite

+0

我将该代码放入.htaccess。是的,网址参数有所不同。第三方API让我回到这些参数。我不确定未来是否不会改变。 –

+0

但是'.htaccess'文件在哪里?我假定它是文档根目录下的'.htaccess'文件,但是,你的代码表明它在'/ shake'子目录中?这可能是故意的,但是,它也可能是一个错误? – MrWhite

回答

0
RewriteCond %{QUERY_STRING} (.*)&?name=(.*)? [NC] 
RewriteRule ^pokladna/?$ $0?%1name_gls=%2 [R=301,L] 

这是接近,但不完全正确。如上所述,这些指令位于位于/shake/.htaccess的WordPress .htaccess文件中。这些指令需要在之前,如果还没有的话。

RewriteRule替代需要一个斜杠前缀进行有效的外部重定向在每个目录.htaccess文件。按照现状,$0反向引用排除了斜杠前缀,因此导致相对路径替换 - 在这种情况下,目录前缀被添加回去,导致无效的重定向。

另一个潜在的问题是在CondPattern,即可选&&?(.*)&?name=(.*)?。在给定的示例URL上,这将工作正常,但是,由于前面的(.*)贪婪,这也将匹配任何查询字符串参数名称,只是以“名称”结尾。例如,形式为id=123&anothername=foo的查询字符串将更改为id=123&anothername_gls=foo - 我怀疑是否可取。解决这个问题的方法是使用替代,例如。 (^|.+&)以匹配查询字符串之前的URL参数(和参数分隔符)。

我也会质疑RewriteCond指令中NC标志的使用 - 这是否应该是不区分大小写的匹配?

并且您已将URL路径上的尾部斜线设置为可选。这真的是可选的吗?如果是,那么你应该确保这是替代规范化。在下面的代码中,我假设尾部的斜杠是强制性的,因为它在您的示例中存在。

有了您的具体的例子,你还需要NEnoescape)标志,以防止在查询字符串中的%编码空间(即%20)是双重编码。

所以,把这些点就是,你可以试试,而不是执行以下操作:

RewriteCond %{QUERY_STRING} (^|.+&)name=(.*) 
RewriteRule ^pokladna/$ /$0?%1name_gls=%2 [NE,R,L] 

注意,这是一个临时的(302)重定向。只有当你确定它工作正常时,才能将R更改为R=301。永久重定向可能会使测试出现问题,因为它们被浏览器强制缓存。

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

而且,正如上面提到的,这些都要前现有的WordPress指令(具体地,之前前端控制器)。