HTAccess重定向-替换特殊字符

时间:2021-03-09 作者:Jennifer

在我的previous post, 我问过如何301重定向所有.com/language/X URL到.com/members/?members_search=X 使用htaccess。

谢天谢地,我得到了帮助,解决办法是RewriteRule ^language/(.*) /members/?members_search=$1 [R=301,L]

我刚刚发现,我还需要将任何现有连字符转换为空格。我假设不会有超过2个连字符。

测试用例

http://example.com/language/american-english 301应该重定向到http://example.com/members/?members_search=american%20english

例如,如果添加了额外的重定向,就可以了,

http://example.com/language/american-english 301重定向到http://example.com/members/?members_search=american-english 哪个301重定向到http://example.com/members/?members_search=american%20english

正下方RewriteRule ^language/(.*) /members/?members_search=$1 [R=301,L], 我添加的代码不正确:

RewriteCond %{QUERY_STRING} members_search

RewriteRule ^(.*)-(.*)$ /$1\\s$2 [L,R=301]

如果有任何想法,请告诉我。

1 个回复
最合适的回答,由SO网友:MrWhite 整理而成

尝试这样做,替换现有重定向(现在是下面的第二条规则):

# Repeatedly replace all hyphens with %20 - internally
RewriteRule ^language/(.*)-(.*) language/$1\\%20$2 [N,DPI]

# Redirect to query string
RewriteRule ^language/(.*) /members/?members_search=$1 [NE,R=301,L]
这只需一个外部重定向即可实现连字符替换和重定向到查询字符串。不需要其他重定向。替换任意数量的连字符。

这需要放在.htaccess 文件

您需要清除浏览器缓存。首先使用302(临时)重定向进行测试。

其他注意事项:

  • language/$1\\%20$2 - 这个% 需要反斜杠转义,否则%2 将被视为一个空的反向引用,因此0 而不是%20.

  • [N,DPI] - 这个N 导致重写引擎立即重新启动-创建循环,直到所有连字符都被替换。这个DPI 丢弃原始路径信息(即之后的零件)需要标记/language/ 在URL中),否则会(自动)重新追加,这可能会导致重写循环。

    NE 为了防止%20 双重编码为%2520.