【问题标题】:.htaccess 301 redirects wordpress.htaccess 301 重定向 wordpress
【发布时间】:2023-05-24 21:05:02
【问题描述】:

我正在尝试将页面的标准 Wordpress“文件夹”URL 重定向到同一域上的新 URL,同时保留所有子文件夹、查询字符串等。从 domain/old-path/domain/new-path/

现在我有了这个:

RedirectMatch 301 ^/old-path(.*) /new-path$1

它可以工作,但是 domain/old-path 重定向到 domain/new-path 并且,这是 WP,另一个重定向发生从 domain/new-pathdomain/new-path/

我希望domain/old-pathdomain/old-path/ 都直接重定向到以/ 结尾的domain/new-path/。 一直以来,就像我说的,保留所有“子文件夹”、查询字符串等。

【问题讨论】:

    标签: wordpress apache .htaccess redirect


    【解决方案1】:

    ...这是 WP,另一个重定向发生在从 example.com/new-pathexample.com/new-path/

    如果/new-path 是一个物理目录,那么触发重定向的不是 WP,而是 Apache 的 mod_dir 正在“修复”该 URL。

    但是,由于您使用的是 WordPress,因此最好使用 mod_rewrite (RewriteRule) 来执行重定向,而不是使用 mod_alias RedirectMatch 以避免冲突。不同的模块在请求期间在不同的时间执行,并且 WP 已经使用了 mod_rewrite。

    在您的 .htaccess 文件的顶部尝试以下类似操作任何现有的 WP 指令之前:

    RewriteRule ^dir/?(.*) /new-dir/$1 [R,L]
    

    如您所见,尽管斜线在RewriteRule 模式中是可选的,但正则表达式永远不会捕获斜线,并且斜线始终存在于替换中.

    仅当您确定它工作正常时,才将 R(临时)重定向更改为 R=301

    【讨论】:

    • 谢谢,这行得通!我明白/? 的意思是“有或没有/”吗?
    • 另外,为什么RewriteRule ^dir/?(.*) /new-dir/$1 [R,L] 有效,而RewriteRule ^/dir/?(.*) /new-dir/$1 [R,L] 无效?
    • 是的,? 是一个正则表达式元字符,它使前面的字符/组成为可选的。 ^/dir/?(.*) 永远不会在 directory/.htaccess 上下文中匹配,因为 RewriteRule pattern 匹配的 URL 路径从不以斜杠开头。目录前缀(.htaccess 文件所在的位置)首先从请求 URI 中删除(特别是以斜杠结尾,因此在匹配之前总是删除斜杠)。这与直接在服务器配置(或虚拟主机)中使用这些指令不同。
    • 所以当使用mod_rewrite 并且没有斜杠时,模式必须相对于.htaccess 的位置,但目标必须来自域的根目录并包含斜杠,对吗?该死,这让我头疼不已,但我认为你让我朝着正确的方向前进。
    • 是的,该模式与.htaccess 的位置相关。目的地(或替代)不需要是相对于根的 - 但它适用于外部重定向(如上所示)!好的,这可能无助于混乱。尝试删除 substitution 上的斜杠前缀(它会中断)...如果您指定相对路径(没有斜杠前缀),那么之前删除的目录前缀将作为替换的前缀。目录前缀是文件系统路径(不是 URL),所以在上面的例子中这会很糟糕。