通配符 301 子文件夹重定向以使用字符替换进行查询

Wildcard 301 subfolder redirect to query with character replacement

我需要使用 .htaccess 文件执行通配符 301 重定向,从文件夹进行字符替换查询。

我需要 mydomain.com/XXX/ 后的所有文件夹重定向,但子文件夹名称中的连字符更改为加号。

示例...

我的域。com/XXX/所有子文件夹/

重定向到

我的域。com/XXX/?s=所有+子文件夹

所以我实际上要做的是将 XXX 文件夹之后的所有文件夹转换为搜索查询,并将所有“-”替换为“+”。

所以如果有人点击 link 到:

mydomain.com/XXX/冰镇啤酒/

他们被重定向到搜索查询

mydomain.com/XXX/?s=冷+啤酒

如果可能的话,我将不胜感激一些解决方案。

这适用于 WP 站点,如果有任何不同的话。

这将完成第一部分:

RewriteEngine on
RewriteRule ^([^/]+)/([^/]+)/$ /?s=

至于将破折号转换为加号,我建议您在脚本中而不是在重写中进行,这对于此类事情来说并不理想。它可以通过自定义脚本映射它,但您也可以在现有的搜索脚本中进行映射,这是一个更好的解决方案。您可以添加一个参数 "needs-translation" 以便您知道哪些查询需要处理:

RewriteEngine on
RewriteRule ^([^/]+)/([^/]+)/$ /?s=&needs-translation=1

如果你真的want/need要在重写中做到这一点,请查看RewriteMap using the prg选项。阅读有关性能和风险的警告。

苦恼7天,终于找到答案

RedirectMatch 301 /XXX/(.*)-(.*) http://example.com/XXX/+
RedirectMatch 301 /XXX/(.*)\/ http://example.com/XXX/?s=

你必须在 wordpress 中这样做而不是

RewriteRule ^XXX\/(.*)-(.*) XXX/+ [R=301]
RewriteRule ^XXX/(.*)\/ XXX/?s= [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/+
RedirectMatch 301 /XXX/(.*)\/ http://example.com/XXX/?s=

所以现在, example.com/XXX/cold-beer/ 重定向到 example.com/XXX/?s=cold+beer, 示例。com/XXX/what-ever/ 重定向到 示例。com/XXX/?s=what+ever 等等。

据我所知,这两行都需要。第一行只转换一个“-”(最后一个)。第二行替换了其余的“-”并删除了尾随的“/”,当您在永久链接设置中设置了 "pretty permalinks" 时,wordpress 重写添加到 URL 的末尾。

无论您使用上述哪种方法,这样做的不利之处在于,每次将“-”转换为“+”本身就是一次重定向,因此如果您有 12 个字符要替换URL,即 12 次重定向。在我的情况下,这不是什么大问题,但对某些人来说可能是这样。

我希望这对其他人有所帮助,因为我无法告诉您我为此浪费了多少时间。我不是任何方式、形状或形式的开发人员。

如果有人有更好的 wordpress 友好方式,我洗耳恭听。