显然,我的.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错误页面?
答案 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
,则会发生以下情况:
/blahblah
blahblah
不是目录blahblah
不是文件blahblah
不是css或脚本/de/blahblah
/de/blahblah
de/blahblah
不是目录de/blahblah
不是文件de/blahblah
不是css或脚本/de/de/blahblah
您需要添加一组额外的条件来重写 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/
目录中。