我有一个虚拟站点配置如下,它重定向所有HTTP请求到HTTPS:
<VirtualHost *:80>
ServerName api.example.com
ProxyPreserveHost on
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
RewriteEngine on
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule ^/?(.*) "ws://localhost:8080/$1" [P,L]
RewriteCond %{SERVER_NAME} =api.example.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
但是下面的配置不起作用,它只是为用户提供站点的HTTP版本:
<VirtualHost *:80>
ServerName secondexample.co.zw
ServerAlias www.secondexample.co.zw
ProxyPreserveHost on
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
RewriteEngine on
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule ^/?(.*) "ws://localhost:8080/$1" [P,L]
RewriteCond %{SERVER_NAME} =www.secondexample.co.zw [OR]
RewriteCond %{SERVER_NAME} =secondexample.co.zw
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
我注意到的唯一区别是第二个配置有一个别名。第二个配置有什么问题?
1条答案
按热度按时间k4ymrczo1#
规则的顺序不正确。规范重定向(HTTP到HTTPS)必须排在第一位。但是,如果要从HTTP重定向到HTTPS,则此处不需要任何代理指令,应将其删除。假定
<VirtualHost *:443>
容器中重复了代理指令。如果你只是将HTTP重定向到HTTPS,那么你不需要使用mod_rewrite。更简单的mod_alias
Redirect
指令是更好的。你应该规范化(www vs non-www)主机名作为重定向的一部分(除非你正在实施HSTS),而不是重定向到同一个主机。例如,它可以简化为:
然后,所有代理指令都位于
<VirtualHost *:443>
容器中。这同样适用于您的第一台vHost。
我注意到的唯一区别是第二个配置有别名。
Alias
在这里没有什么区别。