cloudflare 后面的 Nginx 下载没有扩展名的空文件,或者重定向太多

问题描述 投票:0回答:1

我正在尝试学习 Nginx,但这并不容易。我相当精通 Apache,但到目前为止还没有多大帮助。

我在 SSL 和 Cloudflare 方面遇到了一些非常奇怪的问题。根据我在 CF 上设置的 SSL 级别(灵活/完整/完整(严格)),我的一些网站可以正常工作,而另一些则无法正常工作。没有一种设置可以保证一切正常。并且在每种设置上我也会遇到不同的错误/问题。这一切都很奇怪。 Files downloading instead of a webpage getting served 我将发布我的所有配置文件,因为我想要尽可能多的反馈。我真的想学习,而不仅仅是获得快速解决方案。

我的设置包括以下内容: 托管在不同物理服务器上的主网站:

domain com
通过 Cloudflare 设置的 webmin 页面规则(因为反向代理不起作用):
webmin.domain com
Ghost cms 的反向代理子域:
test.domain com
发票平面的本地目录安装:
invoice.domain com

所有内容都通过 Nginx 运行(除了 webmin,尽管我也想让它与 Nginx 一起使用),所有内容都通过 Cloudflare 代理并使用 Cloudflare 的 Universal SSL(包括 webmin)。 Apache 已被禁用并且从未在此 VPS 上运行。

主网站在不同 VPS 上的 Apache 下运行得非常好,没有任何问题。该 VPS 用于测试/学习目的。在完全(严格)下,两个子域均成功加载,但它们都加载反向代理子域 (sub1.domain com)。 Webmin 抛出“无效 SSL”错误。

在“灵活”下,Webmin 工作正常,但测试抛出“重定向太多”错误(据我所知,即使我配置了零重定向),而发票根本不提供任何服务。没有错误,什么都没有。 Invoice只下载这些奇怪的文件。根 URL 会触发名为 download 的下载。 /index.php 触发实际页面的下载,而 /index.php/setup 触发名为 setup 的下载,类似于下载,因为它不包含数据,也没有文件扩展名。

也许 SNI 可以提供帮助?我知道 apache 上基于名称的虚拟主机已经救了我很多次,SNI 似乎是 nginx 的等价物,尽管我无法找到更多关于它的信息,除了它需要一个流模块,你必须用它来编译 nginx (这个自定义版本包含它)但是我能找到的唯一两个用于设置它的指南已经过时了,而且显然浏览器不再真正支持它,因为政府用它来监视人们或其他东西?

真正让这变得疯狂的是 cURL。以下是

http://test.domain com
的结果: test.domain com http curl

现在这是

https://test.domain.com
test.domain com https curl

狂野,对吧?零问题。现在查看发票: invoice.domain com http curl

没有结果。没有重定向,没有响应,什么都没有。 invoice.domain com https curl

再次完美运行。同时,在任何设备上的任何浏览器中,即使在隐身模式下,发票服务器也没有页面,没有错误,只需下载文件即可。 http 和 https 都可以。

这是 webmin,它使用页面规则 100% 通过 Cloudflare 运行: webmin.domain com http and https curl

这是 nginx -V 的结果: https://pastebin.com/0gwUwLPz

这是 nginx -T 的结果: https://pastebin.com/EyySRK17

nginx reverse-proxy cloudflare sni
1个回答
0
投票

欢迎来到 StackOverflow。这个论坛是针对编程问题的,但无论如何我都会部分回答,因为你的大问题实际上问了很多,但围绕着“PHP 正在下载”问题。

一般来说,我建议通过减少环境以不包含 Cloudflare CDN 来隔离您的问题,然后一次解决一个问题。

你的问题其实和很多 Docker 用户类似,他们将一种技术(Docker)的使用与 NGINX 结合起来,在学好一件事之前处理了很多问题。除了将 NGINX 与 Cloudflare 技术堆叠在一起之外,这与此类似。

PHP源码下载问题是一个经典问题。这意味着无论 NGINX 选择哪个位置来处理请求,都缺少 PHP 处理程序(没有

fastcgi_pass
)。在您的配置中,从以下位置可以明显看出这一点:

location = /index.php { }  

这样的配置告诉NGINX直接提供服务

/index.php
,而不将请求转发给PHP-FPM。您应该始终将
fastcgi_pass
作为任何 PHP 文件位置的最低限度包含,除非您正在执行诸如拒绝访问控制之类的操作,例如没有
fastcgi_pass
就可以了:

location = /config.php { deny all; }  
© www.soinside.com 2019 - 2024. All rights reserved.