在AWS上,我尝试迁移在nginx上运行的PHP Symfony应用程序。我希望能够通过直接与EC2服务器通信并通过ELB(公共路径)来测试应用程序。
我已设置弹性负载均衡器来解密所有SSL流量,并通过端口80将其传递到我的EC2服务器,并通过端口80将端口80直接传递到我的EC2服务器上。
最初这会在我的应用中引起无限重定向,但我研究并通过添加
来修复此问题fastcgi_param HTTPS $https;
使用一些自定义逻辑来查看$ http_x_forwarded_proto,以确定它实际上是通过SSL的。
我仍然无法解决一个问题。当用户登录Symfony应用程序时,如果他们通过ELB来,表单POST最终会返回重定向 https://elb.mysite.com:80/dashboard 代替 https://elb.mysite.com/dashboard 这会给用户一个" SSL连接错误"。
的错误我已尝试过设置
fastcgi_param SERVER_PORT $fastcgi_port;
迫使它远离80,我也添加了
port_in_redirect off
指令但两者没有区别。
我发现解决此问题的唯一方法是改变ELB 443监听器以通过https传递流量。 EC2服务器已配置自认证SSL证书。但这意味着EC2服务器正在浪费容量来执行这种不必要的第二次解密。
非常感谢任何帮助。也许在nginx中有一个单独的方法告诉POST请求不应用端口号?
Nginx vhost config:
server {
port_in_redirect off;
listen 80;
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/mysite.com/self-ssl.crt;
ssl_certificate_key /etc/nginx/ssl/mysite.com/self-ssl.key;
# Determine if HTTPS being used either locally or via ELB
set $fastcgi_https off;
set $fastcgi_port 80;
if ( $http_x_forwarded_proto = 'https' ) {
# ELB is using https
set $fastcgi_https on;
# set $fastcgi_port 443;
}
if ( $https = 'on' ) {
# Local connection is using https
set $fastcgi_https on;
# set $fastcgi_port 443;
}
server_name *.mysite.com my-mysite-com-1234.eu-west-1.elb.amazonaws.com;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log error;
rewrite ^/app\.php/?(.*)$ /$1 permanent;
location / {
port_in_redirect off;
root /var/www/vhosts/mysite.com/web;
index app.php index.php index.html index.html;
try_files $uri @rewriteapp;
}
location ~* \.(jpg|jpeg|gif|png)$ {
root /var/www/vhosts/mysite.com/web;
access_log off;
log_not_found off;
expires 30d;
}
location ~* \.(css|js)$ {
root /var/www/vhosts/mysite.com/web;
access_log off;
log_not_found off;
expires 2h;
}
location @rewriteapp {
rewrite ^(.*)$ /app.php/$1 last;
}
location ~ ^/(app|app_dev|config)\.php(/|$) {
port_in_redirect off;
fastcgi_pass 127.0.0.1:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param HTTPS $fastcgi_https;
# fastcgi_param SERVER_PORT $fastcgi_port;
#fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/vhosts/mysite.com/web$fastcgi_script_name;
include fastcgi_params;
}
}
参考文献: FastCGI application behind NGINX is unable to detect that HTTPS secure connection is used
http://nginx.org/en/docs/http/ngx_http_core_module.html#port_in_redirect
答案 0 :(得分:0)
最后通过另一个渠道获得解决方案。
答案是在文件fastcgi_params文件中用#注释掉SERVER_PORT。
非常感谢来自Nginx的Maxim。