htaccess는 기본 인증에서 하나의 URL을 제외합니다.


79

일반 htaccess 기본 인증 보호에서 하나의 Url (또는 더 나은 하나의 접두사)을 제외해야합니다. /callbacks/myBank또는 같은 /callbacks/.* 일을 수행하는 방법에 대한 힌트가 있습니까?

내가 찾고 있지 않은 것은 파일을 제외하는 방법입니다. 이것은 url이어야합니다 (이는 PHP 프레임 워크를 기반으로하는 솔루션이며 모든 URL은로 리디렉션 mod_rewrite됩니다 index.php). 따라서이 URL에는 파일이 없습니다. 아무것도.

이러한 URL 중 일부는 다른 서비스의 콜백 일 뿐이며 (IP를 알 수 없으므로 IP를 기준으로 제외 할 수 없음) 사용자 / 암호를 입력하라는 메시지가 표시되지 않습니다.

현재 정의는 다음과 같이 간단합니다.

AuthName "Please login."
AuthGroupFile /dev/null
AuthType Basic
AuthUserFile /xxx/.htpasswd
require valid-user 

답변:


59

Apache 2.4를 사용 SetEnvIf중이고 Require지시문이 표현식을 직접 해석 할 수 있으므로 mod_rewrite 해결 방법이 더 이상 필요하지 않은 경우 :

AuthType Basic
AuthName "Please login."
AuthUserFile "/xxx/.htpasswd"

Require expr %{REQUEST_URI} =~ m#^/callbacks/.*#
Require valid-user

아파치 2.4 취급 Require하는 지시 하지 별로 그룹화 <RequireAll>그들이에있는 것처럼 <RequireAny>에 "또는"문으로, 작동합니다. 다음은 요청 URI와 쿼리 문자열을 함께 일치시키고 유효한 사용자를 요구하는 것을 보여주는 더 복잡한 예입니다.

AuthType Basic
AuthName "Please login."
AuthUserFile "/xxx/.htpasswd"

<RequireAny>
    <RequireAll>
        # I'm using the alternate matching form here so I don't have
        # to escape the /'s in the URL.
        Require expr %{REQUEST_URI} =~ m#^/callbacks/.*#

        # You can also match on the query string, which is more
        # convenient than SetEnvIf.
        #Require expr %{QUERY_STRING} = 'secret_var=42'
    </RequireAll>

    Require valid-user
</RequireAny>

이 예에서는에 대한 액세스를 허용 /callbacks/foo?secret_var=42하지만에 대한 사용자 이름과 비밀번호가 필요 /callbacks/foo합니다.

를 사용하지 않는 한 <RequireAll>Apache는 Require 순서대로 각각 일치를 시도 하므로 먼저 허용 할 조건을 생각하십시오.

Require지시문에 대한 참조 는 https://httpd.apache.org/docs/2.4/mod/mod_authz_core.html#require입니다.

그리고 expression 참조는 여기에 있습니다 : https://httpd.apache.org/docs/2.4/expr.html


3
아파치 2.4.7에서 작동하려면 Require expr 주위의 큰 따옴표를 제거해야했습니다. 그 외에는 완벽하게 작동했습니다.
Scott Smith

나도 큰 따옴표를 제거해야했지만 완벽하게 작동했습니다.
TMPilot

1
Apache 2.4.10 / cakephp 3 설치에서 작동하지 않습니다. 가상 경로 (다시 쓰기 규칙) 인 / rest를 제외하고 싶습니다. 왜 작동하지 않는지 알 수 없습니다.
Stephan Richter

3
@ stephan-richter %{REQUEST_URI}값이 다시 작성된 문자열 이기 때문에 나는 의심 합니다. Cake 3의 경우 거의 항상 /webroot/index.php. 경로 인증을 처리하기 위해 Cake 자체를 사용하는 것과 같은 대안적인 접근 방식을 찾아야 할 수도 있습니다.
beporter

당신이 옳습니다. 이 문제에 대한 질문을 게시하고 자신이 답을 발견 stackoverflow.com/questions/41077895/...
스테판 리히터

85

SetEnvIf를 사용 하면 요청이 일부 경로로 시작될 때 변수를 생성 한 다음 Satisfy Any지시문을 사용하여 로그인하지 않아도됩니다.

# set an environtment variable "noauth" if the request starts with "/callbacks/"
SetEnvIf Request_URI ^/callbacks/ noauth=1

# the auth block
AuthName "Please login."
AuthGroupFile /dev/null
AuthType Basic
AuthUserFile /xxx/.htpasswd

# Here is where we allow/deny
Order Deny,Allow
Satisfy any
Deny from all
Require valid-user
Allow from env=noauth

허용 / 거부 지시문은 유효한 사용자 (성공적인 BASIC 인증 로그인)가 있거나 변수가 설정된 경우를 제외하고 EVERYONE 에 대한 액세스를 거부한다고 말합니다 .noauth


이 섹션을 <VirtualHost * : 80> DocumentRoot / var / www / Symfony / web / <Directory / var / www // Symfony / web>에 추가했지만 작동하지 않습니다.
vishal

<파일>이 여기서 작동하지 않는 이유를 설명해 주시겠습니까?
asdmin

1
감사! 정말 나를 도왔고 사건을 조심하십시오-내가 가지고 있었지만 Order deny,allow작동하지 않을 것입니다. 말할 필요도없이 매우 실망 스럽습니다!
James F

2
Allow from env=REDIRECT_noauth작성된 URL 에는이 필요할 수 있습니다 . @vishal의 문제 일 수 있습니다. 여기를보세요 : [ stackoverflow.com/a/41092497/1285585]
Stephan Richter

2
내가 필요로 라인 Allow from env=noauthAllow from env=REDIRECT_noauth작동 할 수 있습니다.
CDuv

6

이 솔루션은 매우 잘 작동하며 통과하려는 화이트리스트를 정의하기 만하면됩니다.

SetEnvIfNoCase Request_URI "^/status\.php" noauth

AuthType Basic
AuthName "Identify yourself"
AuthUserFile /path/to/.htpasswd
Require valid-user

Order Deny,Allow
Deny from all
Allow from env=noauth

Satisfy any

4

나는 다른 해결책을 시도했지만 이것이 나를 위해 일한 것입니다. 다른 사람들에게 도움이되기를 바랍니다.

# Auth stuff
AuthName "Authorized personnel only."
AuthType Basic
AuthUserFile /path/to/your/htpasswd/file

SetEnvIf Request_URI "^/index.php/api/*" allow
Order allow,deny
Require valid-user
Allow from env=allow
Deny from env=!allow
Satisfy any

이렇게하면 API URL과 다음 URL 문자열이 허용됩니다. /index.php/api/ 로그인 할 필요없이 이 열리고 다른 것은 로그인하라는 메시지가 표시됩니다.

예:

mywebsite.com/index.php/api로그인 메시지없이 열림 로그인 메시지없이 mywebsite.com/index.php/api/soap/?wsdl=1열림 mywebsite.com먼저 로그인 메시지가 표시됨


1
<location />
        SetEnvIf Request_URI "/callback/.*" REDIRECT_noauth=1

        AuthType Basic
        AuthName "Restricted Files"
        AuthUserFile /etc/httpd/passwords/passwords
        Order Deny,Allow
        Satisfy any
        Deny from all
        Allow from env=REDIRECT_noauth
        Require user yournickname
</location>

0

보호하는 영역에 Wordpress와 같은 모든 것을 제어하는 ​​모 놀리 식 PHP 스크립트가있는 경우 다른 접근 방식이 이와 같이 작동합니다. 다른 디렉토리에서 인증을 설정하십시오. '/'경로에 쿠키를 설정하는 index.php를 거기에 넣으십시오. 그런 다음 (예를 들어) Wordpress에서 쿠키를 확인하되 $ _SERVER [ 'REQUEST_URI']가 제외 된 URL인지 확인을 건너 뜁니다.

공유 호스팅 플랫폼에서 RewriteRule은 "Satisfy any"와 함께 작동하는 환경 변수를 설정할 수 없습니다.

어떤 접근 방식을 사용하든 보호중인 페이지에 페이지 자체가 없을 때 인증 요청을 트리거하는 이미지, 스타일 시트 등이 포함되어 있지 않은지 확인하십시오.


0

루트 htaccess 파일에 아래 코드를 추가하고 관리자 URL, .htpasswd 파일 페이지를 변경하는 것을 잊지 마십시오.

<Files "admin.php">
        AuthName "Cron auth"
        AuthUserFile E:\wamp\www\mg\.htpasswd
        AuthType basic
        Require valid-user
    </Files>

루트 폴더에 .htpasswd 파일을 만들고 아래에 사용자 이름과 암호를 추가합니다 (기본 사용자 이름 : admin 및 암호 : admin123 설정).

admin:$apr1$8.nTvE4f$UirPOK.PQqqfghwANLY47.

여전히 문제가 발생하면 알려주세요.


0

의도 한대로 기본 인증을 사용하지 않는 이유는 무엇입니까?

user:password@domain.com/callbacks/etc

1
글쎄요, a) 누구도 URI 문자열에서 인증 데이터를 원하지 않고 b) OP가 통화를 사용자 정의 할 기회가 없을 가능성이 높기 때문입니다 (은행의 콜백에 대해 이야기하고 있기 때문에 나는 그가 변경할 수 없다고 가정합니다. 클라이언트 측에서의 행동)
frank42
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.