我有一台运行 Apache 的 Ubuntu 服务器,它托管一个 Wordpress 网站,可以使用 HTTP 访问。还安装了 Nginx,它托管一个只能使用 HTTPS 访问的 Django 网站。
现在,我想要实现的是example.com
和www.example.com
将转到由 Apache 托管的 Wordpress,而api.example.com
将转到由 Nginx 托管的 Django。如果我尝试访问 上的主页api.example.com
,目前这种方法确实有效,但有一个奇怪的问题:当我尝试访问api.example.com/admin
(Django 管理面板)时,页面会重定向到 上的 Wordpress 管理员登录页面www.example.com/wp-admin
。这是为什么呢?
我甚至尝试将 Django 管理面板 URL 更改为其他内容。这反过来又导致 Wordpress 404 页面(“哎呀,找不到该页面!”)。
因此,似乎域名后面的 URL 部分被 Apache 劫持了,即使它位于不同的子域上。这是什么原因造成的?我该如何修复?
Apache 站点配置如下:
<VirtualHost *:80>
ServerName www.example.com
DocumentRoot /var/www/wp
<Directory /var/www/wp>
Options Indexes FollowSymlinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
</VirtualHost>
Nginx 站点配置如下:
upstream app_server {
server unix:/tmp/gunicorn.sock fail_timeout=0;
}
server {
listen 443 ssl;
charset utf-8;
server_name api.example.com;
ssl on;
# Here be a lot of SSL configs
location / {
try_files $uri @proxy_to_app;
}
location @proxy_to_app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://app_server;
}
location /static {
root /var/www/django/static;
}
}
最后,我的 DNS 记录设置如下:
A example.com 1.2.3.4
CNAME api example.com
CNAME www example.com
提前感谢您的帮助。如果您需要更多信息,请告诉我。
答案1
您可能在 Web 浏览器中以这种简写形式输入这些 URL,但浏览器无法正确猜测您想要什么;它可能从历史记录中记住,当您输入“api.example.com”时它应该使用 HTTPS,但对于新 URL“api.example.com/whatever”,它没有历史记录,因此它会首先尝试 HTTP。
如果你使用同一个 IP 地址来执行所有这些操作,那么https://api.example.com/* 将进入监听 HTTPS 端口 (443) 的进程,http://api.example.com/* 仍会转到监听 HTTP 端口 (80) 的进程。
如果您想避免这种情况同时保持相同的 IP 地址,请在仅 HTTP 服务器中设置 api.example.com 虚拟主机,将其收到的每个请求重定向到 HTTPS。
要真正以困难的方式拆分它们,请向服务器添加 api.example.com 的新 IP 地址,并让两个 HTTP(S) 服务器分别在自己的 IP 上监听,然后更新 DNS,以便 api.example.com 指向新的 IP 地址。