为啥我的 .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 重定向规则不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 301 重定向会导致重定向到错误的 url?

高分求301重定向的htaccess规则写法

为啥这个 .htaccess 重定向不起作用?

高分请教.htaccess规则写法..URL 301

两个版本的.htaccess 301重定向

Htaccess 301将规则/ HTTP重定向到HTTPS /非www到www