【问题标题】:htaccess returning 500 error when needs to be 404htaccess 在需要 404 时返回 500 错误
【发布时间】:2013-10-24 20:10:02
【问题描述】:

当在地址栏中输入无效的 url 时,如何使我的 htaccess 规则返回 404。

导致这种情况的两个规则

RewriteRule ^submit/([a-z]+)/([0-9]+)$ /submit?c=$1&i=$2 [L]

RewriteRule ^test/([a-z]+)/([0-9]+)/([0-9]+)$ /test?c=$1&i=$2&q=$3 [L]

当输入正确的 url 时,这两个规则都可以正常工作,但例如最后一个参数不是数字,它会返回 500 错误。

我怎样才能做到,如果这些规则不匹配,那么它将返回 404。

为了进一步澄清采取以下网址test/cooking/9/1 是有效的。 submit/cooking/9 也是如此。

它返回 500 的 url 与重写不匹配,例如“test/cooking/9/1/1,submit/0/0/0”,如果规则我希望它返回 404上面概述的匹配。

完整的 .htaccess 文件

# Turn on rewriting engine
RewriteEngine On

# Internally rewrite submit parameters
RewriteRule ^submit/([a-z]+)/([0-9]+)$ /submit?c=$1&i=$2 [L]

# Internally rewrite test parameters
RewriteRule ^test/([a-z]+)/([0-9]+)/([0-9]+)$ /test?c=$1&i=$2&q=$3 [L]

# Internally rewrite .php
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^/?(.*)$ /$1.php [L]

# Externally redirect .php
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^\ ]+)\.php
RewriteRule ^/?(.*)\.php$ /$1 [L,R=301]

# Add default charset for files
AddDefaultCharset UTF-8

# G-zip deflate compression
<FilesMatch "\\.(js|css|html|htm|php|xml)$">
     SetOutputFilter DEFLATE
</FilesMatch>

【问题讨论】:

  • 这两个规则没有导致错误,您还有其他规则吗?
  • 是的,我会发布我的完整文件
  • 500 是服务器错误。如果服务器遇到错误,则它无法返回 404 响应。您需要修复错误,可能不在这些行中。
  • @MikeW,是的,我明白,但我不知道错误在哪里,apache 不是我的强项
  • 看看error log

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


【解决方案1】:

发生这种情况是因为 Apache 正在读取 URI 作为 PATH INFO 的一部分,并且 testsubmit 的部分匹配 -f 检查即使路径的其余部分不匹配。尝试将 -f 检查更改为:

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}\.php -f

代替:

RewriteCond %{REQUEST_FILENAME}\.php -f

【讨论】:

  • 谢谢,就是这样。请问您花了多长时间才对 apache 如此了解,我似乎永远无法掌握或记住它。
  • @PEPLOVE 我实际上是通过回答关于 SO 的问题了解到的,我什至不使用 mod_rewrite。
  • 谢谢!我一直在苦苦挣扎,想知道为什么我得到 500 错误而不是 404。在 homepage.co.uk/invalidurl 上很好,但在 homepage.co.uk/about/invalidurl 上它不起作用,这解决了它!
猜你喜欢
  • 2011-03-21
  • 2010-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
  • 2020-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多