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

时间:2012-03-21 17:07:58

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

显然,我的.htaccess中的这些行导致服务器输出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 个答案:

答案 0 :(得分:2)

  

这部分是造成错误的原因。为什么它会阻止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. 重写引擎循环,URI = /de/blahblah
  7. 检查第一个condidion:de/blahblah不是目录
  8. 检查第二个条件:de/blahblah不是文件
  9. 检查第三个条件:de/blahblah不是css或脚本
  10. 重写为/de/de/blahblah
  11. 等。等
  12. 您需要添加一组额外的条件来重写 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/目录中。