我有一个php网站,我目前的
.htaccess
文件如下:
<IfModule mod_rewrite.c>
#Options +FollowSymlinks
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?page=$1 [NC,L,QSA]
Options -Indexes
</IfModule>
现在我想对 URL 进行 301 重定向。从
example.com/folder/old-url-london.htm
到example.com/new-url-london/
问题是每次我尝试我得到的东西:
www.example.com/new-url-london/?page=folder/old-url-london.htm
现在我不能改变这条线(
RewriteRule ^(.*)$ /index.php?page=$1 [NC,L,QSA]
),因为它对网站的工作至关重要。
有什么想法吗?
我试过以下方法:
Redirect 301 /folder/old-url-london.htm example.com/new-url-london/
以及
RewriteRule ^folder/old-url-london.htm$ /new-url-london/ [R=301,L]
听起来你可能把规则放在了错误的地方。或者使用
Redirect
指令。和/或现在可能正在看到缓存的响应。
您需要使用 mod_rewrite
RewriteRule
以避免与现有的重写冲突并且规则需要位于文件的顶部,before 现有的重写并且理想情况下在 RewriteEngine
指令之后。
例如:
Options +FollowSymlinks -Indexes
RewriteEngine On
RewriteRule ^folder/old-url-london\.htm$ /new-url-london/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php?page=$1 [QSA,L]
您需要在测试前清除浏览器缓存,因为任何错误的 301(永久)重定向都将被浏览器缓存。为此,首先使用 302(临时)重定向进行测试。
不要忘记在正则表达式中反斜杠转义文字点。
我整理了一些其他的东西:
<IfModule>
不需要包装纸。Options
并重新启用FollowSymLinks
(因为mod_rewrite需要它)RewriteBase
在您发布的指令中不是必需的。NC
不需要重写标志,因为模式.*
已经匹配所有内容。^(.*)$
上的锚点,因为默认情况下正则表达式是贪婪的。你的回答很有效!很有帮助谢谢!