如何通过虚拟环境路由 HTTPS URL

如何通过虚拟环境路由 HTTPS URL

我在虚拟环境中设置安全路由时遇到问题。对网站REST API工作正常。
证书由我工作的公司提供,是我们的域的通配符证书。
我的问题是证书的位置,我无法访问。
我尝试在很多地方配置 SSL,但只能部分起作用。

为了测试这些路由,我使用了 Postman 和常规浏览器 (Chrome)。
我可以成功访问网页、登录,并向 REST API 发送 JSON 请求。
所有 URL 都以 开头http://
当我使用 执行完全相同的操作时https://,浏览器会显示该网站不安全。Postman 还显示连接到 URL 时出错。使用 不会发生这种情况http://

设置如下: 我的虚拟系统的设置

A网关服务器充当多个虚拟机的入口点。我的应用程序在其中一个虚拟机上运行。网关运行阿帕奇2以方便路由到其托管的所有虚拟机。
此外,它还负责处理所有虚拟环境的 SSL 相关事宜。

我正在基于 Symfony 框架用 PHP 开发一个 Web 应用程序。
为了实现与此应用程序的持续集成,我们在Docker实例。在 Jenkins 中成功构建后,脚本会启动一个新的 Docker 镜像。Docker
镜像运行Nginx 服务器它托管我的应用程序。

我尝试在 Nginx 配置和 apache2 配置中配置证书。
但都没有成功。
我发现通配符证书不适用于子子域。因此,my-app.development.mycompany.com我认为它不起作用。
将 URL 更改为development.mycompany.com/my-app/失败,因为 PHP 应用程序发现了该/my-app/部分。
这导致应用程序的路由细节出现问题,并阻止了其他虚拟机的应用程序。

我想了解如何配置 apache2 主机来处理 SSL。为了将来能够在这个虚拟环境中开发更多应用程序,我希望进行设置,以便所有虚拟机都覆盖 HTTPS。
为什么此设置适用于 HTTP,但不适用于 HTTPS?

入口点的虚拟主机配置如下

    <VirtualHost *:444>
        ServerName development.mycompany.com
        SSLEngine on
        SSLCertificateFile /etc/apache2/ssl/certificate_bundle.crt
        SSLCertificateKeyFile /etc/apache2/ssl/certificate.key
        #RewriteEngine on
        ProxyPreserveHost On
 
        <Proxy *>
                Order Deny,Allow
                Allow from all
        </Proxy>
 
        #ProxyPass /my-app/ http://my-app.development.mycompany.com:80/
        #ProxyPassReverse /my-app/ http://my-app.developmenet.mycompany.com$
 
                ProxyPass / http://my-app.development.mycompany.com:80/
                ProxyPassReverse / https://my-app.development.mycompany.com:444/
 
        #<Location />
        #        ProxyPass http://my-app.development.mycompany.com:80/
        #        #ProxyPassReverse https://development.mycompany.com:444
        #        ProxyPassReverse http://my-app.development.mycompany.com:80/
        #</Location>
</VirtualHost>
 
<VirtualHost *:80>
ServerName my-app.development.mycompany.com
                <Proxy *>
                               Order Deny,Allow
                               Allow from all
                </Proxy>
                <Location />
                               ProxyPass http://my-app.development.mycompany.com:80/
                ProxyPassReverse http://my-app.development.mycompany.com:80/
 
                               #ProxyPass http://172.30.1.105:80/
                               #ProxyPassReverse http://172.30.1.105:80/
                </Location>
</VirtualHost>
 
<VirtualHost *:80>
ServerName jenkins.my-app.development.mycompany.com
        <Proxy *>
                Order Deny,Allow
                Allow from all
        </Proxy>
        <Location />
                               ProxyPass http://my-app.development.mycompany.com:86/
                               ProxyPassReverse http://my-app.development.mycompany.com:86/
 
                #ProxyPass http://172.30.1.105:86/
                #ProxyPassReverse http://172.30.1.105:86/
        </Location>
</VirtualHost>
 
<VirtualHost *:443>
        ServerName my-app.development.mycompany.com
        SSLEngine on
        SSLCertificateFile /etc/apache2/ssl/certificate_bundle.crt
        SSLCertificateKeyFile /etc/apache2/ssl/certificate.key
 
        <Proxy *>
                Order Deny,Allow
                Allow from all
        </Proxy>
        <Location />
                ProxyPass http://my-app.development.mycompany.com:80/
                ProxyPassReverse http://my-app.development.mycompany.com:80/
        </Location>
</VirtualHost>
 
<VirtualHost *:443>
                ServerName development.mycompany.com/my-app
                SSLEngine on
                SSLCertificateFile /etc/apache2/ssl/certificate_bundle.crt
        SSLCertificateKeyFile /etc/apache2/ssl/certificate.key
 
        <Proxy *>
                Order Deny,Allow
                Allow from all
        </Proxy>
        <Location />
                ProxyPass http://my-app.development.mycompany.com:80/
                ProxyPassReverse http://my-app.development.mycompany.com:80/
        </Location>
</VirtualHost>
<VirtualHost *:80>
ServerName development.mycompany.com/my-app
        <Proxy *>
                Order Deny,Allow
                Allow from all
        </Proxy>
        <Location />
                ProxyPass http://my-app.development.mycompany.com:80/
                ProxyPassReverse http://my-app.development.mycompany.com:80/
 
                #ProxyPass http://172.30.1.105:80/
                #ProxyPassReverse http://172.30.1.105:80/
        </Location>
</VirtualHost>

我的 Nginx 配置如下

    server {
    listen 80;
    listen 444 ssl;
    server_name development.mycompany.com;
    root /var/www/my-app/web;
    client_max_body_size 4048M;

    location / {
         # try to serve file directly, fallback to app.php
         # try_files $uri /app.php$is_args$args;
         index app.php;
         try_files $uri @rewriteapp;
    }

    location @rewriteapp {
         rewrite ^(.*)$ /app.php/$1 last;
    }

    # DEV
    location ~ ^/(app_dev|config)\.php(/|$) {
        fastcgi_pass php:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
        fastcgi_param HTTPS $https;
    }

    # PROD
    location ~ ^/app\.php(/|$) {
        fastcgi_pass php:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
        fastcgi_param HTTPS $https;
        #internal;
    }

    location ~ \.php$ {
        return 404;
    }

    error_log /var/log/nginx/my_app_error.log;
    access_log /var/log/nginx/my_app_access.log;
}

欢迎任何帮助,提前致谢。

答案1

确保通过打开开发工具删除 chrome 缓存,然后点击开发工具右上角的 3 个点并选择设置,在设置中选择禁用缓存(在 DevTools 打开时),然后关闭设置,现在转到 chrome 中的“i”并单击它,然后删除与您的网站相关的任何 cookie。然后单击您的网站并按 Ctrl + f5,这将硬刷新页面。如果您仍然没有 https,那么另一个消除过程是在 Gtmetrics 等工具中打开网站并使用 https 域,如果 https 不起作用,这将给您一个错误。下一步要尝试的是混合内容,检查您的页面源并搜索 HTTP:如果找到,则您有混合内容,您需要找到 HTTP 请求的来源。确保代理传递中的 URL 正确且带有反斜杠,并确保您的证书是通配符,或者您正在为所有域和子域使用多个证书。这是一份基本的清单。解决您的问题的方法是使用像 cloudflare 这样的 CDN,它提供免费的 SSL 连接,开箱即用。 Cloudflare 还将加速您的网站并防止日益增多的 DDoS 攻击。您只需将 URL 从 HTTP 重写为 https,但实际上,这仅仅是我目前能给出的建议。希望您能从这些建议中找到答案。

相关内容