代码之家  ›  专栏  ›  技术社区  ›  kz2014

使用AWS使用重写规则将http重定向到https会将所有请求发送到默认webroot,而不是使用ProxyPass

  •  1
  • kz2014  · 技术社区  · 6 年前

    我有一个Apache Web服务器,它运行在端口80上的AWS EC2实例上。 我有一张ELB证书。所有请求都被ELB截获并转发到我的EC2实例,我的Web服务器在那里侦听任何调用。

    当出现任何http流量时,我使用下面给出的规则将其重定向到https,该规则在我的http vhost中存在。conf文件:

    <VirtualHost *:80>
    RewriteEngine On
    RewriteCond %{HTTP:X-Forwarded-Proto} =http
    RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
    
    </VirtualHost>
    

    现在在我的http虚拟主机中。conf,我使用proxypass重定向任何到达端口443(默认https端口)的流量,如下所示:

    <VirtualHost *:443>
        ServerName www.mywebsite.com
    
        ProxyRequests Off
        ProxyPreserveHost On
    
        <Proxy *>
            Order deny,allow
            Allow from all
        </Proxy>
    
        ProxyPass / http://localhost:8080/
        ProxyPassReverse / http://localhost:8080/
    </VirtualHost>
    

    现在,假设我打电话到:

    http://www.mywebsite.com
    

    它被重定向到:

    https://www.mywebsite.com
    

    但这个链接现在为索引服务。html文件存在于httpd中给定的默认webroot中。conf文件,而不是使用ProxyPass重定向它。 谁能告诉我哪里出了问题?

    1 回复  |  直到 6 年前
        1
  •  2
  •   chris    6 年前

    如果您在ELB上终止SSL,并且ELB和EC2之间的通信仅在端口80上,那么您的代理配置将永远不会被调用。

    要解决此问题,您有两个选项:第一个选项是将代理配置(您在*:443 VirtualHost条目中的设置)添加到*:80条目中。

    第二个选项是添加配置ELB以与443和80上的EC2实例进行对话。您需要安装(&A);配置SSL和适当的证书(自签名即可)。