目标:设置一个可以接收来自域的 https 和 http 请求的服务器,并转发到服务器上运行的 rails 应用程序。rails 应用程序在 localhost:3002 上运行,并且所有连接到服务器的尝试都是从互联网上的另一台机器进行的。
我遵循了以下指南: http://hints.macworld.com/article.php?story=20041129143420344
这是我的虚拟主机定义
NameVirtualHost *:80
<VirtualHost *:80>
DocumentRoot "/Users/me/projects/myproject/public"
ServerName ssl.mydomain.com
ServerAlias *.ssl.mydomain.com
ProxyPass / http://localhost:3002/ # the rails app forwards all http requests to https
</VirtualHost>
<VirtualHost *:443>
SSLEngine on
SSLProxyEngine On
RequestHeader set Front-End-Https "On"
CacheDisable *
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
DocumentRoot "/Users/me/projects/myproject/public"
ServerName ssl.mydomain.com
ServerAlias *.ssl.mydomain.com
SSLCertificateKeyFile "/private/etc/apache2/certs/webserver.nopass.key"
SSLCertificateFile "/private/etc/apache2/certs/newcert.pem"
SSLCACertificateFile "/private/etc/apache2/certs/demoCA/cacert.pem"
SSLCARevocationPath "/private/etc/apache2/certs/demoCA/crl"
ErrorLog "/Users/me/Desktop/ssl.log"
ProxyPass / https://localhost:3002/
ProxyPreserveHost on
</VirtualHost>
当我尝试通过 Web 浏览器连接到服务器时,出现以下错误:
[Thu Feb 02 16:50:40 2012] [error] (502)Unknown error: 502: proxy: pass request body failed to 127.0.0.1:3002 (localhost)
[Thu Feb 02 16:50:40 2012] [error] [client 96.11.81.39] proxy: Error during SSL Handshake with remote server returned by /session/new
[Thu Feb 02 16:50:40 2012] [error] proxy: pass request body failed to 127.0.0.1:3002 (localhost) from 96.11.81.39 ()
我该如何调试/修复这个问题?
编辑:网络浏览器错误:(此错误发生在远程机器上(相对于服务器))
我输入的网址是https://ssl.mydomain.com
编辑2:Rails 向我抛出的错误:
Filter chain halted as [:ensure_proper_protocol] rendered_or_redirected.
Completed in 0ms (DB: 0) | 302 Found [http://ssl.devtinderbox.com/]
[2012-02-03 10:20:45] ERROR bad Request-Line `?p\001\003\001\000W\000\000\000\020\000\0009\000\0008\000\0005\000\000\026\000\000\023\000\000'.
我不确定这是否重要,因为我认为 SSL 握手需要成功,Rails 才会知道该做什么。
我正在使用 Mac OS X Lion。
答案1
您正在将端口 80(清除 http)和 443(加密 https)转发到同一个端口 3002。这将不起作用。
我没有完全理解您的配置,但 SSL 握手中的错误解释了发生了什么。从这个错误中我可以看出,您正在建立一个到 https(端口 443)的明文连接(http),这显然会失败。
如果你尝试访问类似这样的 URL,你也会得到类似的错误http://服务器:443/并且此端口 443 已为 https 开放。
答案2
(只是复制我自己从 SO 上的重复回答。
不必担心从本地主机到本地主机的前端和后端服务器之间的 HTTPS。
编辑:澄清一下,使用ProxyPass / http://localhost:3002/
而不是ProxyPass / https://localhost:3002/
或者,如果您确实希望使用 SSL 将反向代理连接到后端服务器(当该服务器不在 Apache Httpd 反向代理所在位置时非常有用),除了 之外https://backend-server-address
,还可以使用SSLProxy*
指令来设置 CA 证书,如中所述mod_proxy
文档介绍。
答案3
我从未见过 ProxyPass 用于此用途;如果有人连接到 http,为什么不直接使用 .htaccess 规则强制重定向到 https?
类似这样(如果您没有其他 htaccess 规则):
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]
你说你使用的是 rails 吗?如果应用程序已经有 .htaccess 文件,则需要根据现有规则对其进行修改。如果你发布当前的 .htaccess 文件,我们可以查看一下。