如何为基本的 Webrick 服务器设置默认错误页面?
How to set the default error pages for a basic Webrick server?
我有一个非常基本的 webrick 服务器 运行,用于嵌入式设备的管理页面。我们刚刚向设备添加了基本身份验证,它运行良好,但您会收到通用的 "unauthorized" 消息,如下所示:
<!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>
有谁知道如何将其覆盖到 return 静态 HTML 文件?
查看源代码,看起来 httpresponse.rb
有一个名为 create_error_page
的 "hook":
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_phrase
和 ex.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
(一个不存在的页面)时,您应该会看到自定义错误页面,如下所示:
希望对您有所帮助! :-]
我有一个非常基本的 webrick 服务器 运行,用于嵌入式设备的管理页面。我们刚刚向设备添加了基本身份验证,它运行良好,但您会收到通用的 "unauthorized" 消息,如下所示:
<!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>
有谁知道如何将其覆盖到 return 静态 HTML 文件?
查看源代码,看起来 httpresponse.rb
有一个名为 create_error_page
的 "hook":
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_phrase
和 ex.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
(一个不存在的页面)时,您应该会看到自定义错误页面,如下所示:
希望对您有所帮助! :-]