500内部服务器错误,而不是:404 - 未找到

500内部服务器错误,而不是:404 - 未找到

问题描述:

显然,我的.htaccess中的这些行会导致服务器输出一个500而不是404错误,当尝试访问一个不存在的站点时应该出现这个错误。500内部服务器错误,而不是:404 - 未找到

RewriteEngine On 
# Don't rewrite requests to /de or other real files 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !^.*/(css|scripts) 
# Rewrite incoming requests to their equivalent behind /de 
RewriteRule ^(.*)$ de/$1 [L,QSA] 

唉我很不熟悉.htaccess。在这个导致500而不是404错误的错误中,哪里出错?

这是在日志文件中的错误:

请求超过了10个内部重定向限制由于可能配置错误。如果需要,使用'LimitInternalRecursion'来增加限制。使用'LogLevel debug'来获得回溯。

编辑:

RewriteRule ^(.*)$ de/$1 [L,QSA]

这部分负责的错误。为什么它会阻止404错误页面?

+1

似乎你已经产生了一个无限的重写循环或类似的东西。 – 2012-03-21 17:09:20

+0

是的,这似乎是这种情况。该错误应该由上面的.htaccess引起,因为没有它,错误不会发生。但如何修复thix? – BlueHorizon 2012-03-21 17:13:51

+1

我不是'mod_rewrite'专家;我会尝试[阅读文档](http://httpd.apache.org/docs/2.0/rewrite/),并注释掉所有行,然后逐行开始评论,直到它打破。引用:“关于mod_rewrite的好处是它为您提供了Sendmail的所有可配置性和灵活性。mod_rewrite的缺点是它为您提供了Sendmail的所有可配置性和灵活性。” – 2012-03-21 17:18:36

该部分负责该错误。为什么它会阻止404错误页面?

这不产生404错误页面的原因是因为防止盲目匹配被重写为de/的条件。

这些都是你有3个预防性条件:

# these prevent rewriting if the URI doesn't point to a resource 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 

# this prevents scripts from being rewritten 
RewriteCond %{REQUEST_URI} !^.*/(css|scripts) 

然而,没有什么阻止如果,例如,/de/blahblah不存在的重写。因此,如果有人请求/blahblah,这是发生了什么:

  1. URI = /blahblah
  2. 检查第一condidion:blahblah不是目录
  3. 检查第二个条件:blahblah不是一个文件
  4. 检查第三个条件:blahblah不是css或脚本
  5. 重写为/de/blahblah
  6. Rewr伊特发动机循环,URI = /de/blahblah
  7. 检查第一condidion:de/blahblah不是目录
  8. 检查第二个条件:de/blahblah不是文件
  9. 检查第三个条件:de/blahblah不是CSS或脚本
  10. 重写到/de/de/blahblah
  11. 等等

您需要添加一组附加条件改写IF目标存在:

RewriteCond %{DOCUMENT_ROOT}/de%{REQUEST_URI} -f [OR] 
RewriteCond %{DOCUMENT_ROOT}/de%{REQUEST_URI} -d 

因此,你应该有这样的:

RewriteEngine On 
# Don't rewrite requests to /de or other real files 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !^.*/(css|scripts) 
# make sure rewrite target actually exists as a file or directory 
RewriteCond %{DOCUMENT_ROOT}/de%{REQUEST_URI} -f [OR] 
RewriteCond %{DOCUMENT_ROOT}/de%{REQUEST_URI} -d 
# Rewrite incoming requests to their equivalent behind /de 
RewriteRule ^(.*)$ de/$1 [L,QSA] 

这样, 404将返回,因为没有任何内容会被重写入de/目录。