.htaccess - 500 内部服务器错误而不是 : 404 - Not Found

标签 .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 错误?

这是日志文件中的错误:

Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.

编辑:

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

这部分是导致错误的原因。为什么它可以阻止 404 错误页面?

最佳答案

This part is responsible for the error. Why does it prevent the 404-error page though?

之所以不会产生 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. 检查第一个条件:blahblah 不是目录
  3. 检查第二个条件:blahblah 不是文件
  4. 检查第三个条件:blahblah 不是 CSS 或脚本
  5. 重写为/de/blahblah
  6. 重写引擎循环,URI = /de/blahblah
  7. 检查第一个条件: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/ 目录中。

关于.htaccess - 500 内部服务器错误而不是 : 404 - Not Found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9809464/

相关文章:

mysql - 即使数据存在,Rails 4.0 也会重定向到 404

node.js - 在示例 express-jade 项目上获取样式表和 js 的 404

javascript - AJAX 不在服务器上传递变量(任何 AJAX)

php - .htpasswd 添加/删除/更新用户名和密码 - php windows

rest - kubernetes 入口 TLS 验证和重定向问题

php - 如何允许移动用户绕过重定向?

java - Struts2 Web应用程序404错误

apache - mod_rewrite 重映射文件夹

php - .htaccess 使文件夹充当根目录?

php - 将文件作为附件发送到浏览器