Apache 2.4 .htaccess Require 문이 무시되었습니다.

Apache 2.4 .htaccess Require 문이 무시되었습니다.

각 고객에 대한 사용자 목록과 함께 프로그래밍 방식으로 생성된 .htaccess 파일을 사용하여 정적 보고서가 포함된 애플리케이션의 클라이언트별 하위 디렉터리를 제한하려고 합니다. 하지만 .htaccess 파일이 구문 분석되고 있음을 보여줄 수는 있습니다(포함된 경우 500 ISE). 쓰레기, AllowOverride 작동 중) 더 제한적인 Require 문은 상위 수준 Location 지시문의 Require valid-user를 재정의하지 않습니다.

예. /etc/httpd/conf.d/app.conf

<VirtualHost *:80>
ServerName app

RewriteEngine on
RewriteRule ^/cgi-bin\/api\/(\w+)$ /var/www/cgi-bin/App.cgi?mode=json&request=$1 [QSA,H=cgi-script]

<Directory "/var/www/cgi-bin/">
  Options ExecCGI
</Directory>
<Directory "/var/www/cgi-bin/api/reports/">
  AllowOverride FileInfo AuthConfig
  Options +Indexes +FollowSymLinks -ExecCGI
  IndexOptions +NameWidth=*
  SetHandler default-handler
  LogLevel trace8
</Directory>


<Location /cgi-bin/>
  AuthType Basic
  AuthName "App Server"
  AuthUserFile /etc/httpd/conf.d/app.passwd
  require valid-user
</Location>
<Location /cgi-bin/api/>
  AuthType Basic
  AuthName "App API"
  AuthUserFile /etc/httpd/conf.d/app-api.passwd
  Require valid-user
  LogLevel trace8
</Location>
</VirtualHost>

/var/www/cgi-bin/api/reports/customer1/.htaccess

Require user CUSTOMER1

보고서 디렉토리에 LogLevel Trace8이 설정되어 있으며 다음과 같은 내용이 표시됩니다.

AH01626: authorization result of Require valid-user : denied (no authenticated user yet)
AH01626: authorization result of <RequireAny>: denied (no authenticated user yet)
AH01626: authorization result of Require valid-user : granted,
AH01626: authorization result of <RequireAny>: granted
Response sent with status 200

.htaccess 파일에 넣은 것은 아무것도 참조되지 않는 것 같습니다. RequireAll에 Require 문을 래핑하면 아무 작업도 수행되지 않고 Require all 거부를 설정해도 아무 작업도 수행되지 않습니다. Apache는 .htaccess 지시어를 Location 지시어보다 더 구체적으로 처리하지 않습니다. URI의 (상위, 왼쪽) 부분에 있는 구성입니다.

편집됨: 효과 없이 FileInfo 추가를 시도했습니다. 예제를 더욱 완전하게 업데이트했습니다. 설정 위치 /cgi-bin/api/reports/customer1 사용자 CUSTOMER1이 구성에서 제대로 작동하도록 요구합니다. 작업이 실행될 때마다 웹 서버를 다시 로드하지 않고 일부 작업이 실행될 때 .htaccess AuthZ 파일을 다시 작성하려고 했습니다. 매 순간마다 중요한 AuthZ 변경이 있는 경우에만 httpd를 다시 로드할 수 있는 보다 완벽한 도구를 구축하려는 노력을 기울이고 싶지 않았습니다. 이론적으로 .htaccess는 모든 액세스에 대해 AuthZ 변경 사항을 아파치에서 확인할 수 있어야 하기 때문입니다. 특권적인 재로드.

답변1

초기 질문 후 답변

<Directory>그리고<Location>지시어는 허용되지 않습니다..htaccess파일(참조문맥부분).

그냥 따로 놓아두세요.htaccess내의 파일/foo/bar/reports/Auth*및 지시어가 포함된 폴더입니다 Require. 경로가 다음과 같은지 확인하세요..htpasswd파일이 유효합니다(절대 경로가 선호되어야 함).

그래도 작동하지 않으면AllowOverride지시문이 올바르게 설정되었습니다(예:<Directory>지시문) 내의가상 호스트/서버 구성(.conf내의 파일/etc/apache2/폴더).


질문의 첫 번째 편집 후 답변

.htaccess<Directory>file은 내부 지시문 과 동일합니다 ..conf파일. 현재 인증을 위한 지시문을 혼합하고 <Directory>있습니다 <Location>. <Location>귀하의 지침을 제거해 주시겠습니까?.conf파일을 제출하고 <Directory>지침을 다음으로 바꾸십시오..htaccess손대지 않은 파일:

<Directory "/var/www/cgi-bin/">
  Options ExecCGI
  AuthType Basic
  AuthName "App Server"
  AuthUserFile /etc/httpd/conf.d/app.passwd
  require valid-user
</Directory>
<Directory "/var/www/cgi-bin/api/">
  AuthType Basic
  AuthName "App API"
  AuthUserFile /etc/httpd/conf.d/app-api.passwd
  Require valid-user
  LogLevel trace8
</Directory>
<Directory "/var/www/cgi-bin/api/reports/">
  AllowOverride FileInfo AuthConfig
  Options +Indexes +FollowSymLinks -ExecCGI
  IndexOptions +NameWidth=*
  SetHandler default-handler
  LogLevel trace8
</Directory>

질문을 편집할 때까지 지시어 <Location>.htaccess실제 파일 시스템 위치 대신 가상 폴더를 가리킵니다. 그러나, 그설명서에 명시적으로 명시되어 있음:

<Location>파일 시스템의 개체에 대한 액세스를 제한하려고 할 때는 절대 사용하지 않는 것이 중요합니다 . 이는 다양한 웹 공간 위치(URL)가 동일한 파일 시스템 위치에 매핑되어 제한 사항을 우회할 수 있기 때문입니다.

답변2

당신의 재정의 허용 지시문이 부족합니다.

문서에 대한 내용에도 불구하고 지시어 필요 명령은 다음과 같아야 합니다.

AllowOverride FileInfo AuthConfig

관련 정보