我正在尝试将我的站点根目录重定向到 https。虽然重写已发生,但 https 不会产生任何结果。浏览器显示。connecting to thinkingmonkey.me...
然后停滞不前。
- 听 80&收听 443存在于conf文件中。
- 我已经重新启动了 httpd。
- 我正在使用正确的证书文件和私钥文件。
- 没有错误httpd 日志,SSL 日志(我有一个针对 SSl 的单独日志)。
- 即使我尝试访问https://thinkingmonkey.me直接地。
Anetstat -pant | grep httpd
有这个:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 :::443 :::* LISTEN 1334/httpd
tcp 0 0 :::80 :::* LISTEN 1334/httpd
.htaccess 文件:
RewriteEngine on
RewriteBase /
RewriteCond %{SERVER_PORT} 80
RewriteCond %{REQUEST_URI} ^/$
RewriteRule ^(.*)$ https://thinkingmonkey.me [L,R=302]
重写日志数据:
my-ip - - [24/Jan/2012:19:01:14 +0000] [thinkingmonkey.me/sid#7fa2335ceb18][rid#7fa2339336d8/initial] (2) 使用请求的 uri /
my-ip 初始化重写引擎 - - [24/Jan/2012:19:01:14 +0000] [thinkingmonkey.me/sid#7fa2335ceb18][rid#7fa2339336d8/initial] (1) 传递 /
my-ip - - [24/Jan/2012:19:01:14 +0000] [thinkingmonkey.me/sid#7fa2335ceb18][rid#7fa2339336d8/initial] (3) [perdir /mysite/] 删除 per-dir 前缀:/mysite/ ->
my-ip - - [24/Jan/2012:19:01:14 +0000] [thinkingmonkey.me/sid#7fa2335ceb18][rid#7fa2339336d8/initial] (3) [perdir /mysite/] 将模式 '^(.*)$' 应用于 uri ''
my-ip - - [24/Jan/2012:19:01:14 +0000] [thinkingmonkey.me/sid#7fa2335ceb18][rid#7fa2339336d8/initial] (4) [perdir /mysite/] RewriteCond: input='80' pattern='80' => 匹配
my-ip - - [24/Jan/2012:19:01:14 +0000] [thinkingmonkey.me/sid#7fa2335ceb18][rid#7fa2339336d8/initial] (4) [perdir /mysite/] RewriteCond: 输入='/' 模式='^/$' => 匹配
我的 ip - - [24/Jan/2012:19:01:14 +0000] [thinkingmonkey.me/sid#7fa2335ceb18][rid#7fa2339336d8/initial] (2) [perdir /mysite/] 重写 '' -> 'https://thinkingmonkey.me'
my-ip - - [24/Jan/2012:19:01:14 +0000] [thinkingmonkey.me/sid#7fa2335ceb18][rid#7fa2339336d8/initial] (2) [perdir /mysite/] 明确强制重定向https://thinkingmonkey.me
我的 ip - - [24/Jan/2012:19:01:14 +0000] [thinkingmonkey.me/sid#7fa2335ceb18][rid#7fa2339336d8/initial] (1) [perdir /mysite/] 转义https://thinkingmonkey.me用于重定向
my-ip - - [24/Jan/2012:19:01:14 +0000] [thinkingmonkey.me/sid#7fa2335ceb18][rid#7fa2339336d8/initial] (1) [perdir /mysite/] 重定向至https://thinkingmonkey.me[重定向/302]
这是我的虚拟主机。
<VirtualHost *:80>
ServerName thinkingmonkey.com
ServerAlias www.thinkingmonkey.com www.thinkingmonkey.me
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.)?thinkingmonkey\.(com|me)$ [NC]
RewriteRule ^ http://thinkingmonkey.me%{REQUEST_URI} [L,R=301]
</VirtualHost>
<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot /mysite/
ServerName thinkingmonkey.me
ErrorLog logs/site-error_log
CustomLog logs/site-access_log common
RewriteEngine On
RewriteLog "/var/log/rewrite.log"
RewriteLogLevel 3
</VirtualHost>
<VirtualHost *:443>
ServerName thinkingmonkey.me
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn
SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
SSLCertificateFile /path/to/my.crt
SSLCertificateKeyFile /path/to/my.key
SSLCertificateChainFile /path/to/my.ca-bundle
<Files ~ "\.(cgi|shtml|phtml|php3?)$">
SSLOptions +StdEnvVars
</Files>
<Directory "/var/www/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
SetEnvIf User-Agent ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog logs/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>
lsof -i -P | grep 443
httpd 1334 root 6u IPv6 3297 0t0 TCP *:443 (LISTEN)
httpd 1335 apache 6u IPv6 3297 0t0 TCP *:443 (LISTEN)
httpd 1336 apache 6u IPv6 3297 0t0 TCP *:443 (LISTEN)
httpd 1337 apache 6u IPv6 3297 0t0 TCP *:443 (LISTEN)
httpd 1338 apache 6u IPv6 3297 0t0 TCP *:443 (LISTEN)
httpd 1339 apache 6u IPv6 3297 0t0 TCP *:443 (LISTEN)
httpd 1340 apache 6u IPv6 3297 0t0 TCP *:443 (LISTEN)
httpd 1341 apache 6u IPv6 3297 0t0 TCP *:443 (LISTEN)
httpd 1342 apache 6u IPv6 3297 0t0 TCP *:443 (LISTEN)
这里出了什么问题?
答案1
好的,试试这个:
telnet localhost 443
这会给出响应吗?还是会挂起?如果响应,你应该得到类似以下内容的内容:
$ telnet localhost 443
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
control-]
(如果未安装 telnet,请安装它;您可以通过点击然后输入“q”退出telnet 会话)
如果您能够在本地接口上连接到 Web 服务器(并且根据您的日志,Web 服务器正在运行),则存在防火墙问题(我知道您说您没有设置防火墙,但这将证实这一点)。在这种情况下,运行:
iptables -L -n
并发布结果。
更新
从评论来看,这是一个 EC2 实例,因此请查看与此实例关联的安全组。确保您在安全组中允许 tcp/443。
类似这样的事情可能会有帮助:
答案2
在双栈主机上,监听 ::443 意味着您正在监听 IPv4 和 IPv6。自行测试 TLS 协商:
openssl s_client -connect localhost:443
[lots of negotiation output, to ensure the basics are there]
然后您将能够测试 HTTP 是否回复:
GET / HTTP/1.0
以下是我重定向的方法:
<VirtualHost *:80>
ServerName mail.example.com
RewriteEngine On
RewriteLog /var/log/apache2/rewrite.log
RewriteLogLevel 4
RewriteRule ^(.*)$ https://secure.example.com/mail$1 [R,L]
</VirtualHost>
请移除RewriteLog
并RewriteLogLevel
投入生产,否则可能会出现磁盘被无意义地填满的风险。
答案3
类似问题,apache2 响应 443,日志中没有任何内容
/etc/apache2# openssl s_client -connect localhost:443 -state -debug
给了我以下内容
SSL_connect:unknown state
read from 0x1182fe0 [0x1189010] (7 bytes => 7 (0x7))
0000 - 48 54 54 50 2f 31 2e HTTP/1.
SSL_connect:error in unknown state
139790287365792:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt.c:795:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 295 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
问题是 my.domain.com 的 IP 与虚拟主机中配置的 IP 不同。由于服务器使用 2 个 IP。因此 apache 在 443 上应答,但无法将网站连接到该连接。匹配 IP 一切正常
答案4
值得仔细检查您的提供商提供的 SSL 策略类型。经过大量调试后,我发现我的问题是由我的托管提供商在外部锁定端口 443 引起的,直到我向他们支付 SSL 证书费用。我原本打算使用 LetsEncrypt,但在这样做之前我必须切换主机。无论如何,如果其他解决方案都不起作用,并且您处于 VPS 环境中(或任何您可能对网络控制较少的环境),可能值得仔细检查这一点。