![使用 Nginx 和 proxy_pass 登录 Drupal 失败,但直接访问 Drupal 时可以正常登录](https://linux22.com/image/591684/%E4%BD%BF%E7%94%A8%20Nginx%20%E5%92%8C%20proxy_pass%20%E7%99%BB%E5%BD%95%20Drupal%20%E5%A4%B1%E8%B4%A5%EF%BC%8C%E4%BD%86%E7%9B%B4%E6%8E%A5%E8%AE%BF%E9%97%AE%20Drupal%20%E6%97%B6%E5%8F%AF%E4%BB%A5%E6%AD%A3%E5%B8%B8%E7%99%BB%E5%BD%95.png)
我们需要代理传递一个 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 的默认行为可能发生了变化。无论如何,我希望它能对其他人有所帮助。