我需要使用.htaccess文件从文件夹中进行通配符301重定向以查询并替换字符。
在mydomain.com/XXX/重定向后我需要所有文件夹,但子文件夹名称中的连字符已更改为加号。
示例...
mydomain.com/XXX/ 所有子文件夹 /
重定向到
mydomain.com/XXX/的?S =所有子文件夹+
所以我基本上做的是将XXX文件夹后的所有文件夹转换为搜索查询,并将所有“ - ”替换为“+”。
因此,如果有人点击了以下链接:
mydomain.com/XXX/的冷啤酒 /
他们被重定向到搜索查询
mydomain.com/XXX/的?S =冷+啤酒
如果可以的话,我会很感激一些解决方案。
这适用于WP网站,如果这有任何区别。
答案 0 :(得分:0)
这将完成第一部分:
RewriteEngine on
RewriteRule ^([^/]+)/([^/]+)/$ $1/?s=$2
至于将破折号转换为加号,我建议你在脚本中而不是在重写中这样做,这对于这些事情并不理想。它可以通过自定义脚本映射它,但您也可以在现有搜索脚本中执行此操作,这是一个更好的解决方案。您可以添加参数" needs-translation"所以你知道哪些查询需要处理:
RewriteEngine on
RewriteRule ^([^/]+)/([^/]+)/$ $1/?s=$2&needs-translation=1
如果您真的想要/需要在重写中执行此操作,请使用RewriteMap选项查看prg。阅读有关绩效和风险的警告。
答案 1 :(得分:0)
在拔掉头发7天后,我终于找到了答案。
RedirectMatch 301 /XXX/(.*)-(.*) http://example.com/XXX/$1+$2
RedirectMatch 301 /XXX/(.*)\/ http://example.com/XXX/?s=$1
你必须在wordpress而不是
这样做RewriteRule ^XXX\/(.*)-(.*) XXX/$1+$2 [R=301]
RewriteRule ^XXX/(.*)\/ XXX/?s=$1 [R=301]
因为wordpress默认重写规则会覆盖上面的内容而你无法使用默认的wordpress规则,因为它会渲染你的所有页面&帖子无法访问。
所以我的.htaccess文件看起来像......
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
RedirectMatch 301 /XXX/(.*)-(.*) http://example.com/XXX/$1+$2
RedirectMatch 301 /XXX/(.*)\/ http://example.com/XXX/?s=$1
现在, example.com/XXX/cold-beer / 重定向到 example.com/XXX/?s=cold+beer , example.com/XXX/what-ever / 重定向到 example.com/XXX/?s=what+ever 等等。
据我所知,你需要两条线。第一行只转换一个“ - ”(最后一行)。第二行替换“ - ”的其余部分,并在永久链接设置中设置“非常永久链接”时,删除wordpress重写的尾部“/”添加到URL的末尾。
无论您使用哪种方法,无论您使用上述哪种方法,每次将“ - ”转换为“+”都是自身的重定向,因此如果您要在网址中替换12个字符,这是12次重定向。在我的情况下,这不是一个大问题,但可能是某些人。
我希望这可以帮助别人,因为我无法告诉你我浪费了多少小时。我不是任何方式,形状或形式的开发者。
如果某人有一个更好的方式,那就是wordpress友好,我全都耳朵。