为什么我的.htaccess 301重定向规则不起作用?

时间:2011-09-01 07:07:58

标签: .htaccess redirect http-status-code-301

我在重新设计的网站上使用网址重写来为我的网页提供更整洁的网址。

RewriteEngine On

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^$ index.php [L]

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^.+/$ %{REQUEST_URI}index.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永久重定向,以便旧网站的页面(在重新设计之前)可以重定向到新网站上的页面(出于搜索引擎优化和链接原因)。页面已经重新组织,因此多个旧页面将重定向到新页面,例如。

旧网站没有使用网址重写。因此,我想创建永久重定向,例如/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相反,但不幸的是,旧网址使用的是.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 个答案:

答案 0 :(得分: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]

这应该有效,如果出现问题则予以评论