我有一个 .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/
我的代码中缺少什么导致此问题?
答案 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