重写和重定向不能一起工作

Rewrite and Redirect not working together

我有当前的.htaccess

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

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

我想按照以下方式重定向一些我通常会做的页面:

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

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

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

我无法让旧页面完全重定向。

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

出于这个原因,您应该避免混合来自两个模块的指令,以避免像这样的意外冲突。但是,从您给出的示例中,我不太明白结果 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=&bpar= [L,QSA]
RewriteRule ^([\w-]+)/?$ index.php?apar= [L,QSA]

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

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