为什么 apache 关闭来自远程客户端的图像、javascript 和 css 文件的连接?

为什么 apache 关闭来自远程客户端的图像、javascript 和 css 文件的连接?

我最近在本地网络上的 openSUSE Leap 15.1 服务器上安装了 apache 2.4,并启用了 php。我可以从桌面上的浏览器访问 html 和 php 文件,但无法加载资源(图像、css 和 javascript)。

经过调查,似乎当浏览器请求这些文件而不是 html 或 php 文件时,连接就会关闭:

C:\Users\PATRICK>curl -v http://myserver/style.css
*   Trying 192.168.0.250...
* TCP_NODELAY set
* Connected to myserver (192.168.0.250) port 80 (#0)
> GET /style.css HTTP/1.1
> Host: myserver
> User-Agent: curl/7.55.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Tue, 05 Nov 2019 04:59:19 GMT
< Server: Apache
< Last-Modified: Wed, 30 Oct 2019 06:51:25 GMT
< ETag: "2e5-5961b2954acf9"
< Accept-Ranges: bytes
< Content-Length: 741
< Content-Type: text/css
<
* transfer closed with 741 bytes remaining to read
* Closing connection 0
curl: (18) transfer closed with 741 bytes remaining to read

从服务器本身查询时不会发生此行为。Apache 访问日志似乎表明,从其角度来看,该请求已成功处理:

192.168.200.30 - - [05/Nov/2019:04:59:19 +0000] "GET /style.css HTTP/1.1" 200 741 "http://myserver/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0"

我不知道发生了什么事。

答案1

所以答案是我在 Apache 配置文件中需要这个参数:

EnableSendFile 关闭

作为文档读作:

此指令控制 httpd 是否可以使用内核的 sendfile 支持将文件内容传输到客户端。默认情况下,当处理请求不需要访问文件内的数据时(例如,在传送静态文件时),Apache httpd 使用 sendfile 传送文件内容,而无需读取文件(如果操作系统支持)。

看来我正在运行的服务器(带有 4.12.14-lp151.28.20-default 内核的 OpenSUSE Leap 15.1)没有正确支持此功能。

答案2

嗨,终于在另一个论坛上找到了答案。看看 listen.conf

原文内容:收听 80

因此 apache 服务器只监听 IP6。

我将配置改为:Listen 0.0.0.0:80

现在服务器在 IP4 上监听...它起作用了!

相关内容