无限重定向 - nginx

Posted

技术标签:

【中文标题】无限重定向 - nginx【英文标题】:Infinite redirect - nginx 【发布时间】:2017-04-10 13:30:47 【问题描述】:

我似乎在使用 nginx 进行无限重定向时遇到问题。在过去的半个小时左右,这一直让我发疯,因为我无法确定无限重定向发生在哪里。

虚拟主机:

Server ID : SuperUser Shell : sites-available/ > # cat example.com-ssl 
server 
    listen 80;
    server_name www.example.com example.com;
    return      301 https://www.example.com$request_uri;


server 
    listen 443 ssl;
    server_name example.com;
    return      301 https://www.example.com$request_uri;

    # This is for troubleshooting
    access_log /var/log/nginx/www.example.com/access.log;
    error_log /var/log/nginx/www.example.com/error.log debug;


server 
    listen 443 default_server ssl;
    server_name www.example.com;

    ssl                         on;
    ssl_certificate             /etc/ssl/certs/www.example.com/2017/www.example.com.crt;
    ssl_certificate_key         /etc/ssl/certs/www.example.com/2017/www.example.com.key;
    ssl_trusted_certificate     /etc/ssl/certs/www.example.com/2017/www.example.com.ca-bundle;
    ssl_protocols               TLSv1.1 TLSv1.2;
    ssl_ciphers                 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
    ssl_prefer_server_ciphers   on;
    ssl_session_cache           shared:SSL:10m;
    ssl_dhparam                 /etc/ssl/certs/www.example.com/2017/dhparam.pem;
    add_header                  Strict-Transport-Security "max-age=63072000; includeSubexamples; ";

    location / 
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   Host      $http_host;
        proxy_pass         http://127.0.0.1:2368;
    

    access_log /var/log/nginx/www.example.com/access.log;
    error_log /var/log/nginx/www.example.com/error.log;

Server ID : SuperUser Shell : sites-available/ > #

附加信息:

我还应该指出,这是一个幽灵博客服务器,我已更新 config.js 以反映 https 而不是 http:

Server ID : SuperUser Shell : ghost/ > # cat config.js 
// # Ghost Configuration
// Setup your Ghost install for various [environments](http://support.ghost.org/config/#about-environments).

// Ghost runs in `development` mode by default. Full documentation can be found at http://support.ghost.org/config/

var path = require('path'),
    config;

config = 

    // ### Production
    production: 

        url: 'https://www.example.com',
        mail: ,

        database: 
            client: 'sqlite3',
            connection: 
                filename: path.join(__dirname, '/content/data/ghost.db')
            ,
            debug: false
        ,

        server: 
            host: '0.0.0.0',
            port: '2368'
        
    ,

    // ### Development **(default)**
    development: 

        url: 'https://www.example.com',

        database: 
            client: 'sqlite3',
            connection: 
                filename: path.join(__dirname, '/content/data/ghost-dev.db')
            ,
            debug: false
        ,
    ,

...

Server ID : SuperUser Shell : ghost/ > #

我还使用pm2(我用来保持幽灵运行的东西)重新启动了这个 java 进程。我什至停止了这个过程并重新开始

cURL 输出:

... Same thing as below for 49 times
* Ignoring the response-body
* Connection #0 to host www.example.com left intact
* Issue another request to this URL: 'https://www.example.com/'
* Found bundle for host www.example.com: 0x263b920
* Re-using existing connection! (#0) with host www.example.com
* Connected to www.example.com (123.45.67.89) port 443 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.35.0
> Host: www.example.com
> Accept: */*
> 
< HTTP/1.1 301 Moved Permanently
* Server nginx/1.4.6 (Ubuntu) is not blacklisted
< Server: nginx/1.4.6 (Ubuntu)
< Date: Sat, 26 Nov 2016 08:56:23 GMT
< Content-Type: text/plain; charset=utf-8
< Content-Length: 63
< Connection: keep-alive
< X-Powered-By: Express
< Location: https://www.example.com/
< Vary: Accept, Accept-Encoding
< Strict-Transport-Security: max-age=63072000; includeSubdomains; 
< 
* Ignoring the response-body
* Connection #0 to host www.bestredflags.com left intact
* Maximum (50) redirects followed

问题:

有人知道我在哪里犯错了吗? 我将我的 nginx 配置从运行 nginx version: nginx/1.10.2(没有问题)的 RHEL 7.3 服务器复制到运行 nginx version: nginx/1.4.6 (Ubuntu) 的 Ubuntu 14.04,这可能是我的问题的一部分吗? 在推送 vHost 配置更改之前,我没有收到来自 nginx -t 的错误。 这让我认为我的 vHost 没有问题,但 vHost 配置错误似乎也是合乎逻辑的选择。 我之前想知道的是,这在 nginx 中似乎比在 apache 中重定向 nullwwwhttps://www 要长得多。 我这样做是否适合 nginx? 我正在关注此处提出的文档: https://www.digitalocean.com/community/tutorials/how-to-create-temporary-and-permanent-redirects-with-apache-and-nginx

我希望这不是太多的信息。我绝对不想提供太少的信息。

感谢任何帮助/指点。

【问题讨论】:

我猜你在http://127.0.0.1:2368; 的服务正试图重定向到 https - 没有意识到它在反向代理后面。您可能需要设置额外的标头,例如 proxy_set_header X-Forwarded-Proto $scheme;(假设您的应用程序知道如何使用它们)。 原来我有两个问题。当我重新启用它时,我的 Ghost 配置和 CloudFlare 有一个。感谢您回来并尝试帮助我。我必须等待 2 天才能接受我的答案,但如果你想发布答案,我会接受。 【参考方案1】:

这太尴尬了,但是我在比较配置时发现,我的生产服务器那个 ghost 不需要在 config.js 中指定 https。这导致了我的第一个无限重定向循环。

PROD : SuperUser Shell : ghost/ > # grep sitename config.js 
        url: 'http://www.sitename.com',
        url: 'http://www.sitename.com',
PROD : SuperUser Shell : ghost/ > #

其次,当我重新启用 DNS 保护时,我从 CloudFlare 收到了另一个重定向循环

要更正此问题,请转到概览选项卡 > 设置摘要 > 单击 SSL 并将 SSL 从“灵活”更改为“完全(严格)”。

【讨论】:

以上是关于无限重定向 - nginx的主要内容,如果未能解决你的问题,请参考以下文章

宝塔的nginx开启强制https老是无限重定向

SSL 301 重定向错误 - Joomla 和 Nginx

为啥我在 Rails 应用程序中使用 force_ssl 获得无限重定向循环?

如何在nginx创建临时重定向和永久重定向

nginx为啥返回301重定向

【SWAG】解决nginx重定向问题