我对 Web 开发还很陌生,所以我知道我在服务器配置方面犯了一个初学者错误。我在为 Django 请求提供服务的 Apache 服务器前面有一个 nginx 服务器。我有一些需要登录的视图(通过 @login_required 装饰器),如果用户在未登录的情况下访问其中一个视图,Django 会自动将用户重定向到 /accounts/login/。这在 http 上工作正常,但在 https 上它会将我重定向到 Apache 的本地 IP 地址。例如,不是重定向到https://staging.example.com/accounts/login,我被重定向到http://127.0.0.1:8080/accounts/login。正常的 HTTPS 请求工作正常。我知道我的 nginx 和/或 apache 配置错误,但我不知道原因。
这是我的 nginx 配置文件的一部分:
server {
listen 80;
server_name staging.example.com;
root /path/to/staging/example.com/public_html/;
try_files $uri @django;
#set your default location
location @django {
proxy_pass http://127.0.0.1:8080;
}
...
}
server {
listen 443;
ssl on;
ssl_certificate /path/to/cert-staging.example.com.crt;
ssl_certificate_key /path/to/staging.example.com.key;
server_name staging.example.com;
try_files $uri @django;
#set your default location
location @django {
proxy_pass http://127.0.0.1:8080;
proxy_set_header X-Forwarded-Protocol https;
}
...
}
这是我的 Apache 文件的一部分:
NameVirtualHost *
Listen 127.0.0.1:8080
<IfModule mod_ssl.c>
# If you add NameVirtualHost *:443 here, you will also have to change
# the VirtualHost statement in /etc/apache2/sites-available/default-ssl
# to <VirtualHost *:443>
# Server Name Indication for SSL named virtual hosts is currently not
# supported by MSIE on Windows XP.
Listen 443
</IfModule>
<IfModule mod_gnutls.c>
Listen 443
</IfModule>
答案1
好吧,这个问题花了很长时间才解决。我在 nginx ports.conf 中做了以下修改:
proxy_redirect off;
更改为:
proxy_redirect http://localhost:8080/ /
我使用的所有例子似乎都关闭了 proxy_redirect,这让我有点害怕,但我想我会保持这种状态,直到有人能提供更好的答案。