如何使用 nginx 将请求从 http 重定向到 https

如何使用 nginx 将请求从 http 重定向到 https

如何重定向来自http://example.com:8080https://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/facebookhttps://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;

相关内容