Tengo un Nginx con Docker para mi entorno de desarrollo con HTTP y HTTPS, aquí está la configuración:
listen 80; listen 443 ssl; set_real_ip_from 10.0.0.0/8; real_ip_header X-Real-IP; real_ip_recursive on; location / { try_files $uri @rewriteapp; } location @rewriteapp { rewrite ^(.*)$ /app.php/$1 last; } location ~ ^/(app|app_dev|app_test|config)\.php(/|$) { fastcgi_pass php-upstream; fastcgi_split_path_info ^(.+\.php)(/.*)$; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param HTTPS $https; }Quiero probar HTTP y HTTPS en mi entorno local, pero en producción, tengo un proxy inverso Nginx al frente con:
upstream app_upstream { server app:80; } server { server_name $APP_DOMAIN; listen 443 ssl; ssl_certificate /run/secrets/app_cert.pem; ssl_certificate_key /run/secrets/app_key.pem; proxy_set_header HOST $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; location / { proxy_pass http://app_upstream; } }Quiero que el proxy inverso acepte solo HTTPS y reenvíe a la aplicación nginx, pero mi aplicación PHP detrás está recibiendo $_SERVER['HTTPS'] = ""
También quiero mantener el certificado SSL solo en el proxy inverso, ¿cómo paso HTTPS del proxy inverso a Nginx a PHP?
La variable HTTPS se establece en $https (que se establece de acuerdo con la conexión al servidor backend, que siempre será HTTP), pero desea que se establezca de acuerdo con la conexión reenviada.
Puede usar el encabezado X-Forwarded-Proto para configurar la variable HTTPS usando un map . Por ejemplo:
map $http_x_forwarded_proto $https_flag { default off; https on; } server { ... location ~ ^/(app|app_dev|app_test|config)\.php(/|$) { ... fastcgi_param HTTPS $https_flag; ... } }Consulte este documento para obtener más información.