![Apache、vhost、重定向、https、ssl 问题](https://linux22.com/image/523956/Apache%E3%80%81vhost%E3%80%81%E9%87%8D%E5%AE%9A%E5%90%91%E3%80%81https%E3%80%81ssl%20%E9%97%AE%E9%A2%98.png)
问题:
- https://www.example.com-> 应重定向至http://www.example.com,没有,给出错误代码:ssl_error_rx_record_too_long 没有重定向,error_log:“[错误] [客户端 127.0.1.3] 请求中的方法无效 \x16\x03\x01
- https://www.example.com/fundprocess.html-> 应该重定向https://example.com/fundprocess.html,给出错误代码:ssl_error_rx_record_too_long 没有重定向,error_log:“[错误] [客户端 127.0.1.3] 请求中的方法无效 \x16\x03\x01”
- https://example.com-> 应重定向至http://www.example.com,没有
- http://example.com/-> 应重定向至http://www.example.com,没有
- http://example.com/fundprocess.html应该重定向到https://example.com/fundprocess.html,没有
重写日志中没有针对这些错误的条目。
vhost 配置
<VirtualHost 127.0.1.3:80>
ServerAdmin [email protected]
ServerName www.example.com
DocumentRoot /var/www/html
<Directory /var/www/html>
Options Indexes FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
Redirect permanent /fundprocess.html https://example.com/fundprocess.html
Redirect permanent /fund_process.php https://example.com/fund_process.php
ErrorLog /var/log/apache2/example.com-error_log
TransferLog /var/log/apache2/example.com-access_log
LogLevel warn
RewriteLog /var/log/apache2/example.com-rewrite_log
RewriteLogLevel 9
</VirtualHost>
<VirtualHost 127.0.1.2:80>
ServerAdmin [email protected]
ServerName example.com
DocumentRoot /var/www/html
RewriteCond %{REQUEST_URI} !fundprocess.html [NC]
RewriteCond %{REQUEST_URI} !fund_process.php [NC]
RewriteRule (.*) http://www.example.com/$1 [R=301,L]
RewriteCond %{REQUEST_URI} fundprocess.html [NC]
RewriteCond %{REQUEST_URI} fund_process.php [NC]
RewriteRule (.*) https://example.com/$1 [R=301,L]
</VirtualHost>
<VirtualHost 127.0.1.3:443>
ServerAdmin [email protected]
ServerName www.example.com
DocumentRoot /var/www/html
RewriteCond %{REQUEST_URI} !fundprocess.html [NC]
RewriteCond %{REQUEST_URI} !fund_process.php [NC]
RewriteRule (.*) http://www.example.com/$1 [R=301,L]
RewriteCond %{REQUEST_URI} fundprocess.html [NC]
RewriteCond %{REQUEST_URI} fund_process.php [NC]
RewriteRule (.*) https://example.com/$1 [R=301,L]
</VirtualHost>
<VirtualHost 127.0.1.2:443>
ServerAdmin [email protected]
ServerName example.com
DocumentRoot /var/www/html
<Directory /var/www/html>
Options Indexes FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !fundprocess.html [NC]
RewriteCond %{REQUEST_URI} !fund_process.php [NC]
RewriteRule (.*) http://www.example.com/$1 [R=301,L]
ErrorLog /var/log/apache2/example.com-ssl-error_log
TransferLog /var/log/apache2/example.com-ssl-access_log
LogLevel warn
RewriteLog /var/log/apache2/example.com-rewrite_log
RewriteLogLevel 9
SSLEngine On
SSLCertificateFile /etc/certs/example.crt
SSLCertificateKeyFile /etc/certs/example.key
SetEnvIf User-Agent ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
</VirtualHost>
答案1
这不是重定向的问题,而是 SSL 的问题(重定向之前必须解密请求)。
您的 Apache 配置中是否有Listen 443
任何内容?如果没有,请将其粘贴在 Listen 80 部分附近。您是否在此服务器上运行任何其他 SSL 网站?确保它们没有使用相同的 IP 地址。最后,如果您确实拥有在其他地方可以使用的 SSL 证书,请尝试将其用于此网站 - 它会在浏览器中发出警告,但如果您接受警告,它应该会重定向 - 那么您就知道问题出在您的 SSL 证书上。
答案2
当 apache 期望 ssl 并接收 http 时,会发生 ssl_error_rx_record_too_long。
确保所有端口 443 请求都到达具有 的虚拟主机SSLEngine On
。您需要修复您的<VirtualHost 127.0.1.3:443>
。
此外,您的证书需要同时适用于 example.com 和 *.example.com。否则,您的客户将收到令人讨厌的警告,而不是重定向。