htaccess在404的情况下进行物理重定向

时间:2012-02-21 15:51:04

标签: .htaccess mod-rewrite redirect

首先,我知道当页面不存在时,如何简单地重定向到404

ErrorDocument 404 /index.php

我想要做的是物理重定向到索引页面。因此,如果用户键入mydomain.com/abc并且该页面不存在,则会实际重定向到索引页面。我不希望网址与坏地址保持一致。是的,我知道这不是什么大问题,但它让我烦恼。我可以通过将自定义404页面重定向到主页来完成此操作,但我不想这样做。

我使用[R]重定向标记尝试了这一点,显然它不起作用。

Options -MultiViews
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php [L]
RewriteRule ^(.*)$ /index.php [L,R]

更新

这是我将其重写为mydomain.com/index.php

的错误

我尝试仅使用index.php删除/,但它没有重定向,但在下面给出了同样的错误。

The page isn't redirecting properly         

Firefox has detected that the server is redirecting the request for this address in a way that will never complete.

This problem can sometimes be caused by disabling or refusing to accept
cookies.

2 个答案:

答案 0 :(得分:3)

这样做:

RewriteEngine on
RewriteBase /

RewriteCond %{REQUEST_URI} !(?:\.\w+)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ([^/]+)/?$ $1.php 

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ / [L,R]

<强>解释

检查文件是否有扩展名:

RewriteCond %{REQUEST_URI} !(?:\.\w+)$ [NC]

如果没有,检查文件是否存在:

RewriteCond %{REQUEST_FILENAME} !-f

如果不是文件,请检查它是否是存在的文件夹:

RewriteCond %{REQUEST_FILENAME} !-d

如果没有附加.php。如果最后有/,请将其删除并附加.php

RewriteRule ([^/]+)/?$ $1.php 

检查附加的.php或任何扩展文件是否实际上是存在的文件:

RewriteCond %{REQUEST_FILENAME} !-f

检查它是否是目录:

RewriteCond %{REQUEST_FILENAME} !-d

如果没有,那么它是无效的文件请求并将其重定向到/     RewriteRule ^(。*)$ / [L,R]

答案 1 :(得分:0)

这应该是基于mod_rewrite的404处理:

# if it is not a file, directory or link
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^ index.php [L,R]

但是我不确定你在第一条规则中做了什么?您是否尝试将.php添加到每个请求URI?