【问题标题】:How to forward all requests to www subdomain including https requests?如何将所有请求转发到 www 子域,包括 https 请求?
【发布时间】:2014-06-11 17:24:12
【问题描述】:

我有一个带有 Rails 4 应用程序的 VPS,在 Ubuntu、NginX 和 Unicorn 上运行。

由于我希望对所有页面进行 SSL 加密,因此对 http:// 的所有请求都将转发到 https://,这工作正常。

这是我的 NginX 配置的摘录:

http {

        ....

        server {
                listen 80;
                server_name example.com;
                rewrite ^ https://$server_name$request_uri? permanent;
        }

        server {
                listen 443;
                server_name example.com;
                root /home/rails/public;
                index index.htm index.html;

                ssl on;
                ssl_certificate /etc/ssl/example.com.crt;
                ssl_certificate_key /etc/ssl/example.com.key;

                location / {
                        try_files $uri/index.html $uri.html $uri @app;
                }

                location @app {
                        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                        proxy_set_header X-Forwarded-Proto $scheme;
                        proxy_set_header Host $host;
                        proxy_pass http://app_server;
                 }
        }
}

我怎样才能将所有对http://example.comhttps://example.com 的请求转发到https://www.example.com

感谢您的帮助。

【问题讨论】:

  • 我想使用 Rack 中间件可以解决这个问题。检查这个Railscast

标签: ruby-on-rails ssl nginx


【解决方案1】:

我们在apache2

<VirtualHost *80>
    ServerName frontlineutilities.co.uk
    ServerAlias www.frontlineutilities.co.uk 
</VirtualHost>

Docs

研究了how you'd achieve this in Nginx,我发现了这个:

server {
    listen       80;
    server_name  example.org  www.example.org;
    ...
}

--

捕获请求

我写这个作为答案的原因是因为你的选择是使用中间件还是网络服务器本身

虽然我不知道具体细节,但我确实知道添加到 Rails 中间件最终会导致臃肿。我是modular programming 的坚定支持者 - 并且很乐意将功能分成堆栈的不同部分

您遇到的问题并不是真正的 rails 问题 - 这是一个服务器问题(如何将所有请求路由到 www.)。因此,我强烈建议您专注于服务器以对其进行排序。最后,服务器可以将请求捕获到您的服务器 IP 并相应地路由它们

我将从上面的资源开始并在服务器中进行重定向。无论您向www. 还是标准domain 发送请求,rails 都没有关系

【讨论】:

  • 感谢您的精彩文章。我无法让它工作,这可能是由于我缺乏 Apache 和 NginX 的经验。
  • 您有什么反馈吗?错误/请求问题?
【解决方案2】:

如果您要设置将http://example.comhttps://example.com 重定向到http://www.example.comhttps://www.example.com

以下应该做重定向

server {
    listen 80;
    server_name example.com;
    rewrite ^/(.*) https://www.example.com$request_uri permanent;
} 
server {
    listen 443;
    server_name example.com;
    rewrite ^/(.*) https://www.example.com$request_uri permanent;
} 

您也将原来的 server_name 更改为 www.example.com 希望这会有所帮助。

【讨论】:

  • 谢谢。当我将行 rewrite ^/(.*) https://www.example.com$request_uri permanent; 添加到第一个块(侦听端口 80 的块)时,它适用于普通的 http:// 域。但是,当我也将同一行添加到第二个块时,我在浏览器中收到 too many redirects 错误。如何解决这个问题?
猜你喜欢
  • 2015-02-25
  • 2015-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-02
  • 2018-05-02
  • 1970-01-01
  • 2015-09-30
相关资源
最近更新 更多