我在我的网站上使用下面的代码,它的工作。
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
1条答案
按热度按时间vhipe2zx1#
您应该避免在同一个上下文中混合使用
Redirect
(mod_alias)和RewriteRule
(mod_rewrite)指令,因为您可能会遇到这些意外冲突。mod_rewrite在mod_alias之前处理,尽管配置中的指令顺序明显,Redirect
在请求的URL路径上工作(不是重写的URL路径,也不是查询字符串)。所以,当请求
/oldurl
并将Redirect 301 /oldurl /newurl
与现有的mod_rewrite重写一起使用时,会发生什么:index.php?slug=oldurl
Redirect
创建从/oldurl
(最初请求的URL路径)到/newurl
的重定向slug=oldurl
,因为mod_rewrite修改了它。/newurl?slug=oldurl
。(As如上所述,这与指令的顺序无关,因为它们来自两个不同的模块。)
解决方案
你还需要使用mod_rewrite来重定向,并且必须在现有的重写之前(顺序很重要,因为指令属于同一个模块)。例如:
/oldurl
上可能存在的任何查询字符串都将被保留。例如,/oldurl?foo=bar
被重定向到/newurl?foo=bar
(就像它对Redirect
所做的那样)。如果您特别希望删除任何查询字符串,请在重定向(第一个)规则中包含QSD
标志(查询字符串丢弃)。注意:我删除了正则表达式的尾部
/?
,因为它完全是冗余的。因为你让这个标记是可选的,而且前面的量词是 greedy,那么.*
无论如何都会消耗 optional 结尾的斜杠。如果意图是从捕获的子模式中排除尾部斜杠(如果有的话),那么您需要使前面的量词非贪婪。例如(.*?)/?$
(不需要串首锚)。(我假设你的
.htaccess
文件位于文档根目录下--从你得到的错误重定向来看,它看起来是这样的,尽管/a/b/
前缀有点混乱--见下文)我试过下面的代码
但在访问URL时,我在URL下方获取
我希望这会导致
/newurl?slug=oldurl
,而不是/a/b/newurl?slug=oldurl
?