即使目录存在也使用FallbackResource


11

我已经使用非常基本的配置在Apache 2.4.7上设置了虚拟主机:

<VirtualHost *:80>
  ServerName foo.example.com
  DocumentRoot /var/www/html

  DirectoryIndex index.php
  FallbackResource /index.php
</VirtualHost>

在文档根目录下,我具有以下结构:

/index.php
/help/readme.txt

发出请求时,我得到以下结果:

/bla     -> 200 OK
/help/   -> 404 Not Found
/help/a  -> 200 OK

/help/目录的存在似乎正在导致Apache返回,404因为那里没有目录index.php,但是我希望所有请求都被调用/index.php,从而产生200 OK响应。

我不记得使用时这是一个问题mod_rewrite,但我更喜欢使用(FallbackResource如果可能)。有没有办法来解决这个问题?

更新资料

如果我删除该DirectoryIndex指令,它可以工作,但是会遇到五秒钟的延迟问题

更新3

我正在运行以下测试环境;目录结构如下:

./htdocs
   index.html
   test/
      bla.txt
./conf
   httpd.conf
./logs

的内容httpd.conf是:

ServerName apache-bug.local
Listen 8085

DirectoryIndex disabled
DirectorySlash Off

<VirtualHost *:8085>
DocumentRoot /home/user/apache-bug/htdocs

FallbackResource /index.html
</VirtualHost>

我的config.nice包含:

"./configure" \
"--enable-debugger-mode" \
"--with-apr=/usr/local/apr/bin/apr-1-config" \
"--enable-dir=static" \
"--with-mpm=prefork" \
"--enable-unixd=static" \
"--enable-authn-core=static" \
"--enable-authz-core=static" \
"$@"

要运行服务器:

httpd -X -d /home/user/work/apache-bug/

响应主体的作用是/bla什么?
zerkms 2014年

我不确定自己当时是否理解问题:-S
zerkms 2014年

只是要确保-您使用的是哪个版本的Apache?
珍妮·D

@JennyD我正在运行2.4.7。
2014年

Answers:


8

我也自己回答了这个问题,因为我非常确定问题与内部mod_dir.c工作方式有关,并且我认为这是一个错误

如果无法将资源映射到本地文件系统,则该函数fixup_dflt()将运行,并使用FallbackResource确定要加载的文档。

但是,当资源可以映射到本地文件系统并且是目录时,它将尝试通过运行fixup_dir(); 来解析文档。此函数遍历DirectoryIndex值列表,直到找到第一个合适的文档。

在我的情况下,配置的DirectoryIndex值列表为空,因此fixup_dir()将失败并返回404。

以下补丁对我有用PR):

static int dir_fixups(request_rec *r)
{
    if (r->finfo.filetype == APR_DIR) {
-        return fixup_dir(r);
+        if (fixup_dir(r) != OK) {
+           /* use fallback */
+           return fixup_dflt(r);
+        }
+
+        return OK;
    }
    else if ((r->finfo.filetype == APR_NOFILE) && (r->handler == NULL)) {
        /* No handler and nothing in the filesystem - use fallback */
        return fixup_dflt(r);
    }
    return DECLINED;
}

它基本上是fixup_dflt()fixup_dir()失败之后尝试。

更新2015-04-21

一个修复已提交项目,原定于2.5; 它也可以移植到2.4。

更新2015-05-18

该修复程序已恢复,原因是:

[...]它(至少)原因FallBackResource踢之前,mod_autoindex可能已在踢。

我仍在尝试找出如何避免这种情况。


我会说错误是在fixup_dir()忽略FallbackResource。
Ricky Beam

@RickyBeam是的,但是技术上fixup_dir()不应该知道fixup_dflt(),所以恕我直言,最好将其“更高”修复:)
Jack

7

您的配置应该正确。

奇怪的是,这个问题似乎是mod_deflate

在这里成功复制了配置(没有得到404)后,我还得到了5秒的延迟。但是,我注意到,当UA gzip从其Accept-Header中删除时,该页面会立即显示/接收。您可以使用进行测试wget

有趣的是,进一步的调试strace显示apache将您的内容发送FallbackResource到客户端的套接字,在两种情况下延迟没有明显差异。这在网上也很明显,在HTTP请求之后,从服务器向客户端发送了一个应答包,没有任何明显的延迟1

但是,似乎在这种情况下使用mod_deflate时,UA不知道服务器发送的数据何时结束,因此在TCP连接超时2并被服务器强制关闭之前不呈现任何内容。这符合HTTP / 1.0,其中已关闭的连接表示内容结束。

对于HTTP / 1.1,服务器还有其他可用的方式来指示内容结束 - 但是似乎没有发生任何事情

但是,错误是否潜伏在mod_dir或mod_deflate中,现在超出了我的可用时间。通过禁用gzip压缩,我可以完美地工作。作为解决方法,直到问题永久解决,您可以有选择地禁用gzip。

1)这告诉我们问题不是源于服务器上未清除的缓冲区。
2)默认情况下,使用Apache的超时时间为5秒-这是您5秒钟的起点。


谢谢。5s延迟问题是我主要问题的次要问题,我已经更新了有关如何在本地重现问题的问题。
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.