【问题标题】:500 instead of 404 and 500 throws 500 itself500 而不是 404 和 500 抛出 500 本身
【发布时间】:2014-01-26 13:23:32
【问题描述】:

我在子文件夹中有一个站点,其中有一个 .htaccess 文件,它工作得很好,但如果规则没有找到任何东西,它会引发 500 内部服务器错误而不是 404,但我想我会解决它添加 500 错误文档, 但是 500 错误页面(除了经典的 500 消息)说:

“另外,在执行过程中遇到了 500 Internal Server Error 错误 试图使用 ErrorDocument 来处理请求。”

所以我有两个问题:

  1. 为什么是 500 而不是 404?
  2. 在处理 500 错误文档时导致“附加”错误的原因是什么?

到目前为止,这是我的 .htaccess

DirectorySlash On

RewriteEngine On
RewriteBase /mysubdir/

ErrorDocument 404 /mysubdir/404.php
ErrorDocument 500 /mysubdir/500.php

RewriteRule ^folderexcludedone(/|$) - [NC,L]
RewriteRule ^folderexcludedtwo(/|$) - [NC,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/.]+)$ $1/ [L,R]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/?$ $1.php [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]*)/?$ $1.php?$1=$2 [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)/([^/]*)/?$ $1.php?$2=$3 [L,QSA]

【问题讨论】:

    标签: php regex apache .htaccess mod-rewrite


    【解决方案1】:

    试试这些规则:

    DirectorySlash On
    
    RewriteEngine On
    RewriteBase /mysubdir/
    
    ErrorDocument 404 /mysubdir/404.php
    
    RewriteRule ^(folderexcludedone|folderexcludedtwo)(/|$) - [NC,L]
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([^/.]+)$ $1/ [L,R]
    
    RewriteCond %{REQUEST_FILENAME} -f [OR]
    RewriteCond %{REQUEST_FILENAME} -d [OR]
    RewriteCond %{REQUEST_FILENAME}.php !-f
    RewriteRule ^ - [L]
    
    RewriteRule ^([^/]+)/?$ $1.php [L,QSA]
    
    RewriteRule ^([^/]+)/([^/]+)/?$ $1.php?$1=$2 [L,QSA]
    
    RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ $1.php?$2=$3 [L,QSA]
    

    【讨论】:

    • 好的,它现在似乎适用于所有需要的规则 :) - 所以你能解释一下为什么它现在有效吗? :) 为什么我不能有自定义的 500 错误文档?
    • 实际上你现在可以自定义 500 了 :) 我只是跳过了它,这样我们就不会隐藏实际问题。由于您的正则表达式有点不正确,因此由于循环问题,您得到了 500。我进行了最后一次编辑以纠正我在您的上一条规则中犯的一个小错误。 (我一一测试了你所有的规则,在最后一个我用([^/])代替([^/]+))。
    • 星星 (*) 而不是加号 (+) 在未找到时导致循环错误 => 500 - 不是吗? :) 正则表达式可能真的很棘手......无论如何,非常感谢你,你一直很有帮助 - 一如既往:)
    • 不客气。是的,正是 .*/?$ 导致了 500 个循环错误。正则表达式可能很棘手,但它们也很强大:)
    猜你喜欢
    • 2023-02-10
    • 2011-07-07
    • 2015-05-26
    • 2021-10-05
    • 2020-07-06
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    相关资源
    最近更新 更多