我在虚拟环境中设置安全路由时遇到问题。对网站和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,但实际上,这仅仅是我目前能给出的建议。希望您能从这些建议中找到答案。