【问题标题】:How to set the default error pages for a basic Webrick server?如何为基本 Webrick 服务器设置默认错误页面?
【发布时间】:2015-07-15 23:38:29
【问题描述】:

我为嵌入式设备的管理页面运行了一个非常基本的 webrick 服务器。我们刚刚为设备添加了基本身份验证,效果很好,但您会收到如下一般的“未经授权”消息:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<HTML>
  <HEAD><TITLE>Unauthorized</TITLE></HEAD>
  <BODY>
    <H1>Unauthorized</H1>
    WEBrick::HTTPStatus::Unauthorized
    <HR>
    <ADDRESS>
     WEBrick/1.3.1 (Ruby/2.2.0/2014-12-25) at
     192.168.1.1:1234
    </ADDRESS>
  </BODY>
</HTML>

有谁知道如何覆盖它以返回静态 HTML 文件?

【问题讨论】:

    标签: ruby webrick


    【解决方案1】:

    看源码,httpresponse.rb好像有个“钩子”叫create_error_page

      if respond_to?(:create_error_page)
        create_error_page()
        return
      end
    

    因此,如果您在 WEBrick::HTTPResponse 中添加自己的名为 create_error_page 的 Ruby 方法,则可以设置自己的标记:

    module WEBrick
      class HTTPResponse
        def create_error_page
          @body = ''
          @body << <<-_end_of_html_
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
    <HTML>
      <HEAD><TITLE>#{HTMLUtils::escape(@reason_phrase)}</TITLE></HEAD>
      <BODY>
        <H1>#{HTMLUtils::escape(@reason_phrase)}</H1>
        <HR>
        <P>Custom error page!</P>
      </BODY>
    </HTML>
          _end_of_html_
        end
      end
    end
    

    请注意,您可以访问 @reason_phraseex.code 等变量。根据您的情况,您可以根据需要使用ex.code(例如:401)设置不同的内容。

    这是一个完整示例,您可以在显示自定义错误页面的irb 控制台中运行(请注意,它假定您的文件系统中有一个名为Public 的目录):

    require 'webrick'
    
    module WEBrick
      class HTTPResponse
        def create_error_page
          @body = ''
          @body << <<-_end_of_html_
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
    <HTML>
      <HEAD><TITLE>#{HTMLUtils::escape(@reason_phrase)}</TITLE></HEAD>
      <BODY>
        <H1>#{HTMLUtils::escape(@reason_phrase)}</H1>
        <HR>
        <P>Custom error page!</P>
      </BODY>
    </HTML>
          _end_of_html_
        end
      end
    end
    
    root = File.expand_path '~/Public'
    server = WEBrick::HTTPServer.new :Port => 8000, :DocumentRoot => root
    trap 'INT' do server.shutdown end
    server.start
    

    当您转到http://localhost:8000/bogus(一个不存在的页面)时,您应该会看到自定义错误页面,如下所示:

    希望对您有所帮助! :-]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-10
      • 2017-06-17
      • 2021-09-30
      • 1970-01-01
      • 1970-01-01
      • 2012-10-24
      • 2017-04-03
      相关资源
      最近更新 更多