重写和重定向不能一起工作
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
我无法让旧页面完全重定向。
RewriteRule
和 Redirect
属于不同的 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
可能无论如何都不会匹配真实文件。除非你有没有文件扩展名的文件?!
我有当前的.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
我无法让旧页面完全重定向。
RewriteRule
和 Redirect
属于不同的 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
可能无论如何都不会匹配真实文件。除非你有没有文件扩展名的文件?!