在我的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]
如果有任何想法,请告诉我。
最合适的回答,由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
.