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 页面上引发,而是在那些未被规则捕获的页面上引发。
我看不对,删掉就好了。
我有一个 .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 页面上引发,而是在那些未被规则捕获的页面上引发。
我看不对,删掉就好了。