디렉토리가 존재하더라도 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/디렉토리가 404없기 때문에 Apache가 없기 때문에 Apache가 반환되는 것처럼 보이지만 index.php모든 요청이 호출 /index.php되어 200 OK응답이 생성됩니다.

을 사용할 때 이것이 문제가되는 것을 기억하지는 않지만 가능한 경우 mod_rewrite사용하는 것을 선호 FallbackResource합니다. 이 문제를 해결하는 방법이 있습니까?

최신 정보

DirectoryIndex지시문을 제거하면 작동 하지만 5 초 지연 문제가 발생 합니다.

업데이트 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

내가 문제를 이해하고 있는지 잘 모르겠습니다. : -S
zerkms

확실하게-어떤 버전의 Apache를 사용하고 있습니까?
Jenny D

@JennyD 2.4.7에서 실행 중입니다.
Jack

답변:


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 년 5 월 18 일 업데이트

다음과 같은 이유로 수정 사항이 되돌려졌습니다 .

[...] [적어도] FallBackResource시작하기 전에 킥을 발생시킵니다 mod_autoindex.

나는 아직도 이런 상황을 피하는 방법을 알아 내려고 노력하고 있습니다.


오류가 fixup_dir()FallbackResource 를 무시하고 있다고 말할 것 입니다.
Ricky Beam

@RickyBeam 그렇습니다. 그러나 기술적으로 fixup_dir()알 필요는 없습니다 fixup_dflt(). 따라서 "높은"문제를 해결하는 것이 좋습니다 :)
Jack

7

구성이 정확해야합니다.

이상하게도 문제는 mod_deflate 인 것 같습니다 .

여기에서 구성을 성공적으로 재현 한 후 ( 404는 얻지 않음 ) 5 초 지연이 발생했습니다. 그러나 UA gzip가 Accept-Headers에서 생략 하면 페이지가 즉시 표시 / 수신됩니다. 로 직접 테스트 할 수 있습니다 wget.

흥미롭게도, 추가 디버깅 strace은 아파치 FallbackResource 경우 모두 눈에 띄게 지연없이 클라이언트 의 내용을 클라이언트의 소켓으로 보냅니다 . 이 응답 paket 어떤 주목할만한 지체없이 HTTP 요청 후 서버에서 클라이언트로 전송되는 와이어에 또한 분명하다 1 .

그러나이 경우를 mod_deflate를 사용하는 경우, UA는 데이터가 서버 종료로 보낼 때 모르는, 따라서 밖으로 TCP 연결 시간 전에 아무것도 렌더링하지 않는 것 같다 2 강제 서버에 의해 폐쇄된다. 이는 닫힌 연결이 컨텐츠 끝을 나타내는 HTTP / 1.0을 준수합니다.

에 대한 HTTP / 1.1 서버는 다른이 의 끝 내용을 신호하는 데 사용할 수단 - 여기서 발생하는 것 어느하지만, 전혀 .

그러나 mod_dir 또는 mod_deflate에 버그가 숨어 있으면 지금은 사용 가능한 시간을 초월합니다. gzip 압축을 비활성화하여 불완전하게 작동하도록했습니다. 문제가 해결 될 때까지 해결 방법으로 gzip을 선택적으로 비활성화 할 수 있습니다.

1 ) 이것은 문제가 서버의 풀리지 않은 버퍼에서 비롯된 것이 아니라는 것을 알려줍니다.
2 ) 기본적으로 시간 초과는 아파치에서 5 초이며 5 초부터 시작됩니다.


감사. 5 초 지연 문제는 내 주요 문제에 부수적 인 문제이므로 로컬에서 문제를 재현하는 방법으로 내 질문을 업데이트했습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.