index.html.bak가 index.php(Apache)보다 우선하는 이유는 무엇입니까?

index.html.bak가 index.php(Apache)보다 우선하는 이유는 무엇입니까?

나는 새로운 가상 데비안 11 설치에서 이상한 동작을 발견했습니다. user/public_html에서 페이지를 일부 변경하고 있었는데 어느 시점에서 브라우저가 인덱스 파일을 렌더링하는 대신 다운로드하기 시작했습니다.

문제가 index.html.bak 파일이라는 것을 깨닫기까지는 꽤 오랜 시간이 걸렸습니다. 폴더에 index.php가 있는데도 다운로드되던 파일이었습니다.

저는 configs 및 .htaccess에서 DirectoryIndex를 설정하여 이를 테스트했으며 index.html이 index.php보다 먼저 설정될 때마다 그리고 DirectoryIndex가 설정되지 않은 경우 항상 문제를 복제할 수 있습니다. Index.html.bak는 항상 index.php보다 먼저 제공됩니다. index.php가 DirectoryIndex에서 먼저 설정되면 index.php가 올바르게 제공됩니다.

이상한 점은 이것이 /var/www가 아닌 ​​public_html에서만 발생한다는 것입니다.

이전 Apache가 설치된 이전 Debian 서버에서는 이것을 복제할 수 없습니다.

이것은 버그입니까, 아니면 구성에 잘못된 것이 있습니까? 새로 설치한 이후로 구성을 거의 건드리지 않았습니다.

아파치 버전은 Server version: Apache/2.4.54 (Debian) Server built: 2022-06-09T04:26:43

답변1

아파치 모듈mod_mime

Apache mod_mime설정과아파치 2.4 mod_mime문서. 특히 MultiviewsMatch지시어 설정과관련 문서.

동일에서 발췌된 다음 경고에 유의하십시오. 허용" 확장자를 인식하지 못하는 Any경우에도 일치시킬 확장자 "mod_mime일으킬 수 있다" 웹마스터가 전혀 예상하지 못한 파일 .old이나 서비스를 제공하는 등 예측할 수 없는 결과입니다 .".bak

아파치 모듈mod_mime
이 모듈은 HTTP 응답을 위해 선택된 콘텐츠에 콘텐츠 메타데이터를 할당하는 데 사용됩니다.URI 또는 ​​파일 이름의 패턴을 메타데이터 값에 매핑하여. 예를 들어 콘텐츠 파일의 파일 이름 확장자는 콘텐츠의 인터넷 미디어 유형, 언어, 문자 집합 및 콘텐츠 인코딩을 정의하는 경우가 많습니다. 이 정보는 해당 콘텐츠가 포함된 HTTP 메시지로 전송되고 대안을 선택할 때 콘텐츠 협상에 사용됩니다. 따라서 서비스할 수 있는 여러 콘텐츠 중 하나를 선택할 때 사용자의 기본 설정이 존중됩니다. 보다mod_negotiation에 대한 자세한 내용은내용 협상.

확장자가 여러 개인 파일

파일은 하나 이상의 확장자를 가질 수 있습니다. 확장 순서는 다음과 같습니다.보통무관하다. 예를 들어 파일의 경우Welcome.html.fr콘텐츠 유형 text/html 및 언어 프랑스어, 그 다음 파일에 매핑됩니다.Welcome.fr.html정확히 동일한 정보에 매핑됩니다.

파일 이름의 마지막 점으로 구분된 부분만 메타데이터의 특정 부분에 매핑되도록 하려면 다음을 사용하지 마십시오.추가하다지시문.

MultiviewsMatch지령

// apache.org > 2.4 > mod_mime > multiviewsmatch

MultiviewsMatch에 대해 세 가지 다른 동작을 허용합니다.mod_negotiation님의 다중뷰 기능:Any   NegotiatedOnly   Filters|Handlers [처리기|필터]

멀티뷰를 사용하면 파일 요청(예 : , 또는 ) index.html이 기본 요청 다음에 협상된 확장자와 일치하도록 할 수 있습니다 .index.html.enindex.html.frindex.html.gz

NegotiatedOnly옵션은 기본 이름 뒤의 모든 확장자가 mod_mime콘텐츠 협상을 위해 인식된 확장자(예: Charset, Content-Type, Language 또는 Encoding)와 상호 연관되어야 함을 제공합니다. 이는 예상치 못한 부작용이 가장 적은 가장 엄격한 구현이며 기본 동작입니다.
 

Handlers및/또는 와 연관된 확장을 포함하려면 지시문을 Handlers, Filters 또는 두 옵션 키워드 모두로 Filters설정하십시오 .MultiviewsMatch

확장을 인식하지 못 Any하더라도 마침내 확장이 일치하도록 허용할 수 있습니다 . 이로 인해 웹마스터가 전혀 예상하지 못한 파일 이나 파일이 mod_mime게재되는 등 예측할 수 없는 결과가 발생할 수 있습니다 ..old.bak

답변2

사용자 덕분에사각지대의 답변나는 이 수수께끼를 (대부분은 적어도) 풀고 적절한 구성을 구현할 수 있었습니다.

내 모든 원래 질문에 대한 답변:

index.html이 index.php보다 먼저 정렬된 경우 DirectoryIndexApache는 먼저 index.html의 우선 순위를 지정한 다음 index.html의 대체 버전(예: index.html.bak)이 없으면 index.php를 제공하기 전에 우선 순위를 지정합니다.

내 Apache mods-enabled/userdir.conf에는 Options MultiViews이미 기본적으로 설정되어 있습니다. 이 옵션을 사용하면 MultiviewsMatchfoo.html.fr과 같은 대체 파일을 제공할 수 있는 지시문을 사용할 수 있습니다 .

내 Apache 기본 구성 apache2.conf에서는 Options MultiViews/var/www에 대한 옵션이 기본적으로 활성화되어 있지 않으므로 문제의 동작이 사용자의 public_html 사이트에서만 발생했습니다.

이 두 가지 기본 설정이 왜 다른지 모르겠습니다.

.bak 파일의 경우 MIME 유형은 application/x-trashDebian에서 기본적으로 설정됩니다. 이것이 브라우저가 .html.bak 파일을 렌더링하는 대신 다운로드하는 이유입니다.

내 Debian 기반 시스템의 Apache에서 언급한 내용과 Apache 문서 사이에는 약간의 불일치가 있습니다.

아파치 문서 mod_mime.html#multiviewsmatch

mod_mime이 확장을 인식하지 못하더라도 마침내 모든 확장이 일치하도록 허용할 수 있습니다. 이로 인해 웹마스터가 전혀 예상하지 못한 .old 또는 .bak 파일을 제공하는 등 예측할 수 없는 결과가 발생할 수 있습니다.

실제로 .old 및 .bak 파일은 MultiviewsMatch NegotiatedOnly구성된 경우에도 제공됩니다. 해당 파일 확장자는 application/x-trash데비안의 /etc/mime.types에 MIME 유형이 할당됩니다 . 나에게 이 동작은 그다지 의미가 없으며 문서에도 모순되므로 어떤 면에서는 실제로 이것은 버그입니다.

이제 완전히 비활성화하고 싶지 않지만 Multiviews일부 알려진 파일 형식 제공을 비활성화하려면 mods-enabled/mime.conf에서 예를 사용 RemoveType bak하고 를 사용하여 아파치에서 해당 MIME 유형을 제거할 수 있습니다 MultiviewsMatch NegotiatedOnly.

관련 정보