【问题标题】:Rewrite and Redirect not working together重写和重定向不能一起工作
【发布时间】:2021-09-27 20:16:38
【问题描述】:

我有当前的 .htaccess

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/+$ $1 [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([\w-]+)/([\w-]+)/?$ index.php?apar=$1&bpar=$2 [L,QSA]
RewriteRule ^([\w-]+)/?$ index.php?apar=$1 [L,QSA]

我想重定向一些我通常会这样做的页面,如下所示:

redirect 301 /old-page https://www.domain.co.uk/new-page

但是,这似乎重定向到页面

https://www.domain.co.uk/new-page?apar=old&bpar=page

我无法让旧页面干净地重定向。

【问题讨论】:

    标签: apache .htaccess redirect mod-rewrite mod-alias


    【解决方案1】:

    RewriteRuleRedirect 属于不同的 Apache 模块(分别是 mod_rewrite 和 mod_alias)。因此,它们在请求期间独立运行并在不同时间运行。尽管配置中指令的明显顺序,mod_rewrite 总是在 mod_alias 之前运行。

    因此,您应该避免混合来自两个模块的指令以避免像这样的意外冲突。但是,从您给定的示例中,我不太清楚生成的 URL 来自何处,除非请求是针对/old/page,而不是/old-page? (对/old-page 的请求将导致重定向到/new-page?apar=old-page。)

    由于您已经在使用 mod_rewrite,您应该使用 mod_rewrite 代替此重定向并将其包含在您现有的指令之前。例如:

    RewriteRule ^old-page$ https://www.example.com/new-page [R=301,L]
    

    首先使用 302(临时)重定向进行测试以避免潜在的缓存问题,并且您需要在测试之前清除浏览器缓存,因为此错误的 301(永久)重定向可能已被浏览器。


    旁白:

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^([\w-]+)/([\w-]+)/?$ index.php?apar=$1&bpar=$2 [L,QSA]
    RewriteRule ^([\w-]+)/?$ index.php?apar=$1 [L,QSA]
    

    您在第一条规则之前有一个文件系统检查(RewriteCond 指令),但在第二条之前没有。 (文件系统检查仅适用于后面的第一条规则。)

    事实上,RewriteCond 指令可能根本不需要,因为RewriteRule 可能无论如何都不会匹配真实文件。除非你有没有文件扩展名的文件?!

    【讨论】:

    • 很好的答案!谢谢!你对 /old/page 而不是 /old-page 是正确的!你知道你的东西!
    猜你喜欢
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 2015-09-06
    • 2012-08-11
    相关资源
    最近更新 更多