如何重定向来自http://example.com:8080到https://example.com:8080使用 nginx?
我正在做这个项目https://github.com/JKHeadley/appy.git我使用 nginx 将请求从端口 80 引导到端口 443。Nginx 重定向到端口 3000 上的前端 web 应用程序的位置。
Web 应用程序将后端 API 重定向到端口 8080。
现在,在前端 Web 应用程序上,当我单击某个社交媒体链接(例如 Facebook)时。请求将通过 Appy 服务器发送到 Facebook,其中包含我的 Facebook 凭据。但是,当请求重定向回 Appy 服务器时,请求如下:
http://example.com:8080/auth/face-book&state=ZXn29Y7PsAX17Fso7cfHQ1&scope=email
Facebook 抛出以下错误:
Facebook has detected that Appy-World isn't using a secure connection to transfer information.
所以我想重定向从外部服务器返回的请求http://example.com:8080/auth/facebook到https://example.com:8080/auth/facebook,才能成功建立安全连接。
要检查上述情况,您可以访问此网址http://myappy.cf
下面是我的配置文件。
server {
listen 80 default_server;
server_name _;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name _;
# server_name myappy.cf;
ssl_certificate /etc/nginx/fullchain.pem;
ssl_certificate_key /etc/nginx/privkey.pem;
ssl_buffer_size 8k;
ssl_dhparam /etc/ssl/certs/dhparam-2048.pem;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_protocols TLSv1.3 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;
ssl_ecdh_curve secp384r1;
ssl_session_tickets off;
# OCSP stapling
ssl_stapling on;
ssl_stapling_verify on;
access_log /var/log/nginx/jenkins.access.log;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Fix the “It appears that your reverse proxy set up is broken" error.
proxy_pass http://web:3000;
proxy_read_timeout 90;
proxy_redirect http://web:3000 https://web:3000;
}
}
上述情况是否可能?我们能用 nginx 解决这个问题吗?如果是,我该如何解决/实现它?我到底需要在这个配置文件中添加什么才能实现我的目标。如果不是,有什么替代解决方案?
尽快回复将不胜感激。谢谢
答案1
您可以尝试使用 Nginx http 到 https 重定向。以下网站详细解释了重定向:https://serversforhackers.com/c/redirect-http-to-https-nginx。
我认为您的问题可以通过将此代码添加到您的 nginx 配置中来解决:
server {
listen 80 default_server;
server_name _;
return 301 https://$host$request_uri;
}
Facebook 通常会重定向到请求来源的 URL,因此如果您从 https 发送请求,则应将其重定向到 https。使用上述代码,您可以捕获所有端口 80 (http) 请求并将其重定向到端口 443 (https)。因此,整个网站应该提供 https 服务。
您还应该在 Facebook 设置下检查有效 OAuth 重定向 URI 是否为 https:Facebook 登录 > 设置。
还有一个选项可以禁用“强制 HTTPS”,但不建议禁用此选项。
答案2
最好的方法是:
server {
listen [::]:443 ssl; # managed by Certbot #you said you host it on 443 and 80, so here we are on https (that one is for ipv6)
listen 443 ssl; # that one is for ipv4
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; #i suggest using letsencrypt certs as they're free
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; #same as above
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # i'm using 4096 bit rsa because it's safer and gives better results on ssllabs.com
server_name example.com; #your server name
access_log /var/log/example.access; #logs are good to know if someone messes up
error_log /var/log/example.error;
location / { #now the real magic
proxy_pass http://127.0.0.1:3000; #you should give an address with port you use to access the application locally
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host:$server_port;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
server { #that clause is for redirecting http connections to https
listen 80;
listen [::]:80;
server_name example.com;
return 301 https://example.com$request_uri;
}
如果这不起作用 - 请评论我的消息,我们会尝试找出为什么如果您在端口 3000 上托管应用程序,您会重定向到端口 8080。
编辑:我看到了您的项目自述文件,我个人会尝试使用域 api.example.com 对后端执行相同的操作proxy_pass http://127.0.0.1:8080;
。