htaccess 404 重定向不起作用

htaccess 404 redirect does not working

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

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

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

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

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

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

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

你应该把

<IfModule mod_rewrite.c>
    RewriteEngine On

开始,

</IfModule>

在您的 .htaccess 代码的末尾

尝试在重写规则之前添加

RewriteEngine On

尝试将此规则添加到您的 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]

您可以使用 ErrorDocument 指令将不存在的请求转发到特定目的地

在一个空的 .htaccess 文件中测试这个

ErrorDocument 404 /page.php

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

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]

试试这个:

ErrorDocument 404 /404/

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

所以,当它获得 404 时,它会重定向到您的 URL,然后再次获得 404。

形成一个递归循环。 明白我的意思。 ?

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

我希望这会奏效。

如果您添加像 http://www.mywebsite.com/404/ 这样的域(这不是编码业力),自定义 404 永远不会起作用,当您像这样输入 url 时,它最终会出现 500 错误。这意味着它执行了 404 但由于配置错误的 htaccess 而将用户重定向到 500 错误。

当错误出现在 4XX 系列中时,称为客户端错误,5XX 称为服务器端错误。有关详细信息,2XX 称为成功,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=&page=&id=&des= [NC,QSA,L]

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

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

ErrorDocument 404 /404.html

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

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

给你的样本 URL http://www.domain.com/en/news/1/something/test/,当 URL 与定义的规则不匹配时,它会触发最后一个重写规则并陷入无限循环:

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这样的URL,但它被定义的规则(第一条规则)捕获了,我们没有遇到任何递归。因此,此内部错误不会在所有 not found 页面上引发,而是在那些未被规则捕获的页面上引发。

我看不对,删掉就好了。