为啥我的 .htaccess 301 重定向规则不起作用?
Posted
技术标签:
【中文标题】为啥我的 .htaccess 301 重定向规则不起作用?【英文标题】:Why isn't my .htaccess 301 redirect rule working?为什么我的 .htaccess 301 重定向规则不起作用? 【发布时间】:2011-11-08 04:23:04 【问题描述】:我在重新设计的网站上使用 URL 重写来使我的页面更整洁。
RewriteEngine On
RewriteCond %ENV:REDIRECT_STATUS ^$
RewriteRule ^$ index.php [L]
RewriteCond %ENV:REDIRECT_STATUS ^$
RewriteRule ^.+/$ %REQUEST_URIindex.php [L]
RewriteCond %ENV:REDIRECT_STATUS ^$
RewriteRule ^(.+\.php|(.+/)?index)$ - [R=404,L]
RewriteCond %ENV:REDIRECT_STATUS ^$
RewriteCond %SCRIPT_FILENAME.php -f
RewriteRule ^(.+)$ $1.php [L]
这个 .htaccess 文件允许 /filename 实际上指向 /filename.php。一切正常。
但是,我现在意识到我应该设置 301 永久重定向,以便旧网站的页面(重新设计之前)可以重定向到新网站上的页面(出于 SEO 和链接原因)。页面已重新组织,例如,多个旧页面将重定向到新页面。
旧网站没有使用 URL 重写。因此,我想创建永久重定向,例如 /about-page.php 到 /about,每个旧页面使用一条规则手动执行。
我已经尝试了几件事,例如...
RewriteCond %ENV:REDIRECT_STATUS ^$
RewriteRule ^about-page.php$ about [R=301,L]
...或...
Redirect 301 /about-page.php /about
...但它总是最终要么根本不工作(当我尝试访问 /old-filename.php 时给我一个 404 错误,或者用内部服务器错误破坏一切。如果我使用它似乎工作正常Redirect 301 /about-page.html /about
,但不幸的是旧 URL 使用 .php 扩展名,而不是 .html 扩展名。
我认为问题与其他规则之一有关,它将 /xyz 的请求重定向到 /xyz.php,可能会创建一些无限循环。但我不知道如何解决它。
有什么建议吗?非常感谢。
编辑:最终的工作 .htaccess 文件:
DirectoryIndex index.php #
RewriteEngine On
# -- Use a permanent redirect to point the old page to the new page.
# -- The RewriteCond is needed, or a redirect loop happens in certain cases.
# -- The full URL seems to be needed, or it redirects incorrectly.
RewriteCond %ENV:REDIRECT_STATUS ^$
RewriteRule ^about-page.php$ http://www.mywebsite.com/about [R=301,L]
# -- Redirect most other .php files to a 404 error, to avoid duplicate content.
RewriteCond %ENV:REDIRECT_STATUS ^$
RewriteRule ^(.+\.php|(.+/)?index)$ - [R=404,L]
# -- Redirect requests without an extension, but for a valid file, to that file.
# -- I'm not sure what the RewriteCond lines are for, but they both seem necessary.
RewriteCond %ENV:REDIRECT_STATUS ^$
RewriteCond %SCRIPT_FILENAME.php -f
RewriteRule ^(.+)$ $1.php [L]
【问题讨论】:
【参考方案1】:DirectoryIndex index.php # -- this sets index.php to be default file for a folder
RewriteEngine On
# -- RewriteRule ^(.+\.php|(.+/)?index)$ - [R=404,L]
# -- dude this above line redirects all php files to 404 error
# -- so delete this, its a problem not solution
RewriteCond %SCRIPT_FILENAME.php -f
RewriteRule ^(.+)$ $1.php [L]
RewriteRule ^about-page.php$ /about [R=301,L]
这应该可以,如果出现问题,请评论
【讨论】:
感谢您的回复。不幸的是,这似乎不起作用。这会使“mywebsite.com/about-page.php”重定向到“mywebsite.com/home/mysite/mywebsite.com/about”,从而导致 404 错误。将 PHP 文件重定向到 404 错误的规则旨在通过强制用户访问重写 URL 处的页面(不带 .php 扩展名)来防止不同 URL 处的重复内容;我不希望他们直接访问真正的 .php 文件。我认为如果在发生 301 重定向时可以以某种方式忽略该规则,它会正常工作吗? 好吧,我成功了。我遇到了很多麻烦,因为我的浏览器似乎正在缓存 301 重定向,即使我从 .htaccess 文件中删除了规则,它也会继续重定向!我似乎也需要 ENV:REDIRECT_STATUS RewriteCond 行,尽管我不确定它的用途。我将编辑我的问题以包含最终结果。感谢您的帮助。RewriteRule ^about-page.php$ /about [R=301,L]
leading / 阻止它重定向 mywebsite.com/home/mysite/mywebsite.com/about
您可以选择将所有 PHP 文件重定向到非 PHP 地址,但将它们重定向到 404 错误并不好。 301 重定向被缓存,所以在你没有完成你的 htaccess 文件之前,使用 302 重定向,它不会被缓存。以上是关于为啥我的 .htaccess 301 重定向规则不起作用?的主要内容,如果未能解决你的问题,请参考以下文章