使用 Nginx 和 proxy_pass 登录 Drupal 失败,但直接访问 Drupal 时可以正常登录

使用 Nginx 和 proxy_pass 登录 Drupal 失败,但直接访问 Drupal 时可以正常登录

我们需要代理传递一个 URL,其中 my.domain.com 需要获取 drupal.apps.server.com。我们配置了重写并且运行正常。

然后我们配置了 proxypass,访问 my.domain.com 时,我们可以获取内容,但无法登录应用程序(Drupal 管理页面)。如果您直接通过 drupal.apps.server.com 访问,我们可以登录并访问管理页面。

请查看我们的配置:

server {
        listen   80;
        server_name my.domain.com;
                location /{
                proxy_pass http://drupal.get apps.server.com/;
                proxy_set_header X-Forwarded-Host $host;
                proxy_set_header X-Forwarded-Server $host;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                }
       }

有人可以帮助我们吗?

谢谢 Geo

答案1

您的语法看起来正确,可以通过以下方式访问您的 Drupal 网站http://my.domain.com/我自己也使用同样的语法来代理 Nginx。我怀疑问题出在其他地方。

这可能是 cookie 问题。请确保您的 Drupal 配置已更新,以便它相信 my.domain.com 是 Drupal 安装的地址。

如果不是这个问题,你应该澄清以下内容:

  • 当您说“无法登录”时,您到底能进行到什么程度,屏幕上又返回了什么?
  • 当你无法登录时,你在访问和错误日​​志中发现了什么

另外,使用工具检查 HTTP 请求和响应标头是否正确。(例如,您可以仔细检查 cookie 域)。我最喜欢的是 Perl 的 LWP::UserAgent 发行版中的“HEAD”、“POST”和“GET”工具。(某些 Linux 发行版上为 libwww-perl)。例如:

POST -sSe http://my.domain.com/drupal/login/form

更新您已澄清,主页上的链接会显示后端 URL。请确保您的 URL 是相对 URL 或绝对 URL,以 'http://my.domain.com'。如果 URL 直接指向后端服务器,则它们将不起作用。

答案2

我在 Fedora 14 上使用此 nginx 配置运行了相同类型的设置:

location / {
    proxy_pass      http://internal-server.example.com:8064;
    proxy_set_header HTTP_USING_HTTPS 1;
    proxy_set_header X_FORWARDED_HOST example.com;
}

然后我升级到 Fedora 17 并开始看到同样的行为。用户名/密码被接受,但我收到 Drupal 的错误,告诉我我没有访问权限。

我使用 Firebug 进行了检查,并在登录时看到了这个 HTTP 标头:

Set-Cookie SESSb13(skipped)706445be1=dg_xv(skipped)ZI; expires=Fri, 21-Sep-2012 21:40:17 GMT; path=/; domain=.internal-server.example.com; HttpOnly

这让我认为 cookie 域存在问题。

我不完全确定这是由运行更新版本的 Nginx 引起的,但在 Nginx 配置中添加以下“proxy_set_header”行可以解决我的问题:

location / {
    # The next line solved the problem for me:
    proxy_set_header Host $http_host;

    proxy_pass      http://internal-server.example.com:8064;
    proxy_set_header HTTP_USING_HTTPS 1;
    proxy_set_header X_FORWARDED_HOST example.com;
}

因此,proxy_pass 的默认行为可能发生了变化。无论如何,我希望它能对其他人有所帮助。

相关内容