.htaccess 301在查询字符串中显示旧页面URL的重定向

oxf4rvwz  于 2023-05-01  发布在  其他
关注(0)|答案(1)|浏览(109)

我在我的网站上使用下面的代码,它的工作。

RewriteEngine On
RewriteBase /a/b/
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)/?$ index.php?slug=$1 [QSA,L]

我可以访问我的网站,如

https://www.example.com/a/b/testing

现在,我遇到了301重定向的问题。
我试过下面的代码

Redirect 301 /oldurl /newurl

但在访问URL时,我在URL下方获取

https://www.example.com/a/b/newurl?slug=oldurl

我的预期输出是下面的URL。

https://www.example.com/a/b/newurl
vhipe2zx

vhipe2zx1#

您应该避免在同一个上下文中混合使用Redirect(mod_alias)和RewriteRule(mod_rewrite)指令,因为您可能会遇到这些意外冲突。mod_rewrite在mod_alias之前处理,尽管配置中的指令顺序明显,Redirect在请求的URL路径上工作(不是重写的URL路径,也不是查询字符串)。
所以,当请求/oldurl并将Redirect 301 /oldurl /newurl与现有的mod_rewrite重写一起使用时,会发生什么:

  1. mod_rewrite在内部将请求重写为index.php?slug=oldurl
  • Redirect创建从/oldurl(最初请求的URL路径)到/newurl的重定向
  • 查询字符串(如果有)会附加到目标URL。现在是slug=oldurl,因为mod_rewrite修改了它。
  • 结果URL为/newurl?slug=oldurl

(As如上所述,这与指令的顺序无关,因为它们来自两个不同的模块。)

解决方案

你还需要使用mod_rewrite来重定向,并且必须在现有的重写之前(顺序很重要,因为指令属于同一个模块)。例如:

RewriteEngine On
RewriteBase /a/b/

RewriteRule ^oldurl$ /newurl [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) index.php?slug=$1 [QSA,L]

/oldurl上可能存在的任何查询字符串都将被保留。例如,/oldurl?foo=bar被重定向到/newurl?foo=bar(就像它对Redirect所做的那样)。如果您特别希望删除任何查询字符串,请在重定向(第一个)规则中包含QSD标志(查询字符串丢弃)。
注意:我删除了正则表达式的尾部/?,因为它完全是冗余的。因为你让这个标记是可选的,而且前面的量词是 greedy,那么.*无论如何都会消耗 optional 结尾的斜杠。如果意图是从捕获的子模式中排除尾部斜杠(如果有的话),那么您需要使前面的量词非贪婪。例如(.*?)/?$(不需要串首锚)。
(我假设你的.htaccess文件位于文档根目录下--从你得到的错误重定向来看,它看起来是这样的,尽管/a/b/前缀有点混乱--见下文)

  • 旁白:*

我试过下面的代码

Redirect 301 /oldurl /newurl

但在访问URL时,我在URL下方获取

https://www.example.com/a/b/newurl?slug=oldurl

我希望这会导致/newurl?slug=oldurl,而不是/a/b/newurl?slug=oldurl

相关问题