我在我的服务器上使用 nginx 进行请求转发。我有两个服务器块,一个用于主网站,另一个服务器块用于提供我的 S3 静态内容。
server {
listen 80;
server_name abc.guru www.abc.guru;
access_log off;
error_log off;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_redirect off;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
}
}
# Server for S3 This accepts anything apart from the above two
server {
# Listen on port 80 for all IPs associated with your machine
listen 80 default_server;
# Catch all other server names
server_name _;
}
这有效abc.guru
但如果我输入www.abc.guru
它会失败即给出错误此网页有重定向循环。我参考了文档,它说我们可以添加多个域使用空间。
我有我的 DNS 记录www @
,@ 指的是根 IP 地址。
我如何才能使其在第一个服务器块和第二个服务器块中的任何其他域中运行?
在我的 .htaccess 文件中
RewriteRule (.*) http://www.abc.guru/$1 [R=301,L]
RewriteRule ^http://www.abc.guru/$1 agent.guru [L]
RewriteRule ^http://www.abc.guru/$1 index.php [L]
答案1
这里的罪魁祸首是 Apache 配置中的第一个 RewriteRule。它告诉 Apache 将每个请求重定向到http://www.abc-guru.com
。
因此,当 nginx 向 发送请求时http://www.abc-guru.com
,该请求被路由到 Apache,并且第一个 RewriteRule 将该请求重定向到http://www.abc-guru.com
,从而导致重定向循环。
最好的解决方案是将重定向迁移到 nginx,就像 xxdesmus 建议的那样。
abc-guru.com
另一个选项是限制仅当 HTTP Host 标头带有 RewriteCond 指令时才应用第一个 RewriteRule 。
答案2
为什么不直接在 Nginx 中处理这些重定向,而是在 Apache htaccess 文件中处理这些重定向呢?使用 301 重定向转发 root -> www,然后在 www server_name 块中将其发送到您的 proxy_pass (Apache)?