htaccess 404重定向不起作用

时间:2016-07-21 06:25:23

标签: php apache .htaccess redirect http-status-code-404

我有一个 .htaccess 文件来管理我网站上的 rewrite_rules 。我还设置了 404重定向命令,以便在访问者输入错误的网址时将访问者导航到特定页面。但是,如果访问者请求无效的网址,则此重定向无效,我会收到 500内部服务器错误。以下是我的代码的一部分:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)/([0-9]+)/([^/]+)/?$ index.php?lang=$1&page=$2&id=$3&des=$4 [NC,QSA,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)/(p[0-9]+)/?$ index.php?lang=$1&page=$2&pn=$3 [NC,QSA,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)/?$ index.php?lang=$1&page=$2 [NC,QSA,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/?$ index.php?lang=$1&page=home [NC,QSA,L]

ErrorDocument 404 http://www.mywebsite.com/404/

我的代码中缺少什么导致此问题?

9 个答案:

答案 0 :(得分:1)

通过查看所有.htaccess规则,罪魁祸首是:

RewriteRule ^(.*)$ $1 [NS,E=no-gzip:1,E=dont-vary:1]

提供示例网址http://www.domain.com/en/news/1/something/test/,当网址与定义的规则不匹配时,它会触及此最后一次重写规则,并且会陷入无限循环:

applying pattern '^([^/]+)/([^/]+)/([0-9]+)/([^/]+)/?$' to uri 'en/news/1/something/test/'
...
applying pattern '^([^/]+)/([^/]+)/(p[0-9]+)/?$' to uri 'en/news/1/something/test/'
...
applying pattern '^([^/]+)/([^/]+)/?$' to uri 'en/news/1/something/test/'
...
applying pattern '^([^/]+)/?$' to uri 'en/news/1/something/test/'
...
applying pattern '^(.*)$' to uri 'en/news/1/something/test/'
...

然后我们有一个递归开始:

applying pattern '^([^/]+)/([^/]+)/([0-9]+)/([^/]+)/?$' to uri 'en/news/1/something/test/'
...

虽然未找到类似http://www.domain.com/en/news/1/wrong的网址,但它已被定义的规则(第一条规则)捕获,并且我们不会遇到任何递归。因此,所有未找到的页面都不会抛出此内部错误,而是那些未被规则捕获的错误。

我看不出来,只需删除它。

答案 1 :(得分:0)

你应该把

<IfModule mod_rewrite.c>
    RewriteEngine On

在开始和

</IfModule>

在你的.htaccess代码的最后

答案 2 :(得分:0)

尝试将此规则添加到htaccess的顶部:

RewriteEngine On
RewriteRule ^404/?$ /pages/errors/404.php [L]

然后在那下:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^ http://domain.com/404/ [L,R]

答案 3 :(得分:0)

您可以使用EroorDocument指令来阻止对特定目标的不存在的请求

在空的.htaccess文件中测试它

ErrorDocument 404 /page.php

答案 4 :(得分:0)

检查下面的代码,我已经写了各种场景。

ErrorDocument 404 http://example.com/404/
ErrorDocument 500 http://example.com/500/
# or map them to one error document:
# ErrorDocument 404 /pages/errors/error_redirect.php
# ErrorDocument 500 /pages/errors/error_redirect.php

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} ^/404/$
RewriteRule ^(.*)$ /pages/errors/404.php [L]

RewriteCond %{REQUEST_URI} ^/500/$
RewriteRule ^(.*)$ /pages/errors/500.php [L]

# or map them to one error document:
#RewriteCond %{REQUEST_URI} ^/404/$ [OR]
#RewriteCond %{REQUEST_URI} ^/500/$
#RewriteRule ^(.*)$ /pages/errors/error_redirect.php [L]

答案 5 :(得分:0)

在ErrorDocument之后,您提到的URL似乎无效或无法访问。

所以,发生的事情是,当它获得404时,它会重定向到您的URL,并再次获得404。

形成递归循环。 明白我的观点。 ?

尝试使用简单的静态html页面。

我希望这会奏效。

答案 6 :(得分:0)

如果您添加http://www.mywebsite.com/404/之类的域名(它不是编码业力),自定义404将无法工作,当您输入这样的网址时,它将以500错误结束。这意味着它执行了404但由于错误配置了htaccess而将用户重定向到500错误。

当4XX系列错误出现时,客户端错误和5XX称为服务器端错误。有关详细信息,2XX称为Success&amp; 3XX称为重定向。

所以这里是快速尝试(我假设你有404 html文件)

ErrorDocument 404 /404.html 

而不是

ErrorDocument 404 http://www.mywebsite.com/404/

我也在我身边测试了这个代码并且它有效。请试试

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)/([0-9]+)/([^/]+)/?$ index.php?lang=$1&page=$2&id=$3&des=$4 [NC,QSA,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)/(p[0-9]+)/?$ index.php?lang=$1&page=$2&pn=$3 [NC,QSA,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)/?$ index.php?lang=$1&page=$2 [NC,QSA,L]

ErrorDocument 404 /404.html

答案 7 :(得分:-1)

试试这个:

ErrorDocument 404 /404/

答案 8 :(得分:-2)

尝试在rewriterules之前添加

RewriteEngine On