htaccess에서 AuthUserFile과 함께 RELATIVE 경로를 사용하는 방법은 무엇입니까?


98

기본 인증을 사용하는 .htaccess가 있습니다. .htpasswd 파일의 경로가 htaccess 파일에 상대적이 아니라 서버 구성에 상대적인 것 같습니다.

따라서 동일한 디렉토리에 .htaccess 및 .htpasswd 파일이 있어도 작동하지 않습니다.

AuthType Basic
AuthName "Private Login"
AuthUserFile .htpasswd
Require valid-user

그러나 절대 경로를 사용하도록 AuthUserFile을 변경하면 작동합니다.

AuthType Basic
AuthName "Private Login"
AuthUserFile "/home/user/public_html/mydir/.htpasswd"
Require valid-user

그러나 나는 다른 지역의 여러 사이트에서 이것을 사용하기 때문에 더 많은 모바일을 선호합니다. 웹을 검색했지만 해결책이 없습니다. 상대 경로 또는 변수를 사용할 수 %{DOCUMENT_ROOT}있습니까?

답변:


51

AuthUserFile에 대해 상대 경로를 사용할 수 없습니다 .

파일 경로는 사용자 파일의 경로입니다. 절대적이지 않은 경우 (예 : 슬래시로 시작하지 않는 경우) ServerRoot.

그 제한을 받아들이고 해결해야합니다.


우리가 사용하고있는 IfDefine아파치와 함께 명령 줄 매개 변수 :

.htaccess (개발 및 라이브 시스템 모두에 적합) :

<IfDefine !development>
  AuthType Basic
  AuthName "Say the secret word"
  AuthUserFile /var/www/hostname/.htpasswd
  Require valid-user
</IfDefine>

개발 서버 구성 (Debian)

다음에 다음을 추가하십시오 /etc/apache2/envvars.

export APACHE_ARGUMENTS=-Ddevelopment

나중에 아파치를 다시 시작하면 개발 서버에 있지 않을 때만 암호 프롬프트가 표시됩니다.

물론 개발 서버에 대해 다른 IfDefine을 추가 할 수 있습니다 !. 블록을 복사하고 .


4
그러나 이것은 여전히 ​​절대 경로 ( /var/...)를 사용하고 질문은 "상대 경로를 사용하는 방법"을 묻습니다.
sdaau

1
그리고 질문은 "아니오":)과 대답 제대로에 편집 된
Erenor 파스

15

사람들이 이에 대한 해결책을 찾고있는 경우를 위해 :

<If "req('Host') = 'www.example.com'">
    Authtype Basic
    AuthName "user and password"
    AuthUserFile /var/www/www.example.com/.htpasswd
    Require valid-user
</If>

1
이것은 훌륭 할 것이지만에 의존하는 것이 안전 req('Host')합니까? 클라이언트가이 값을 속일 수는 없습니까?
마르코 Demaio

1
@MarcoDemaio 예, 예를 들어 IP 주소를 사용하여 속일 수 있습니다. 구성에 따라 다릅니다. 절대적인 예 또는 아니오가 아닙니다. 때에 따라 다르지.
Maxime

12

1) .htpasswd서버 루트 아래에 파일 이있는 것은 안전하지 않은 것으로 간주됩니다 .

2) 문서 는 상대 경로에 대해 이렇게 말하고 있으므로 운이 좋지 않은 것 같습니다.

파일 경로는 사용자 파일의 경로입니다. 절대적이지 않은 경우 (즉, 슬래시로 시작하지 않는 경우) ServerRoot에 상대적인 것으로 처리됩니다 .

3) 환경 변수 사용을 권장하는 답변은 완벽하게 작동하지만 .htaccess파일에 자리 표시자를 넣거나 코드베이스에 다른 버전을 사용하고 배포 프로세스에서 모두 설정 하도록하는 것이 좋습니다 (예 : 자리 표시 자 교체 또는 이름 바꾸기 / 적절한 파일 이동).

Java 프로젝트에서는 Maven을 사용하여 이러한 유형의 작업을 수행합니다. 예를 들어 PHP 프로젝트에서 배포 된 파일을 환경에 맞게 조정하는 build.sh 및 / 또는 install.sh 셸 스크립트가 있습니다. 이는 코드베이스를 대상 환경의 세부 사항 (즉, 환경 변수 및 구성 매개 변수)에서 분리합니다. 일반적으로 응용 프로그램은 환경에 적응해야합니다. 다른 방법으로 수행하면 환경이 다른 응용 프로그램이나 완전히 관련이없는 시스템 특정 요구 사항을 충족해야하는 경우 문제가 발생할 수 있습니다.


8

인증 설정을 환경에 넣을 수 있습니다. 처럼:

SetEnvIf HTTP_HOST testsite.local APPLICATION_ENV=development
<IfDefine !APPLICATION_ENV>
  Allow from all
  AuthType Basic
  AuthName "My Testseite - Login" 
  AuthUserFile /Users/tho/htdocs/wgh_staging/.htpasswd
  Require user username
</IfDefine>

인증은 작동하지만 내 환경을 실제로 실행할 수 없습니다.


1
문제는 다음과 같습니다. "이전 SetEnvIf [NoCase] ​​지시문에 의해 정의 된 환경 변수 만 이러한 방식으로 테스트 할 수 있습니다. 'Earlier'는 더 넓은 범위 (예 : 서버 전체) 또는 이전에 정의되었음을 의미합니다. 현재 지시문의 범위. " (여기에서 찾았습니다 : askapache.com/htaccess/setenvif.html ) 동일한 범위를 가지고 있기 때문에 환경을 실행할 수 없습니다.
user470370 2012 년

4
작동하지 않는이 매우 왜 좋은 여기에서 설명 stackoverflow.com/questions/11073752/...
니코 gawenda

그러나 이것은 여전히 ​​절대 경로 ( /Users/...)를 사용하고 질문은 "상대 경로를 사용하는 방법"을 묻습니다.
sdaau

예. 그러나 환경 당 여러 절대 경로를 사용하기 위해 여러 APPLICATION_ENV 설정을 사용할 수 있습니다.
digitaldonkey

5

.htpasswd에는 서버의 절대 루트로부터의 전체 절대 경로가 필요합니다.

echo로 파일의 전체 절대 경로를 얻으십시오 echo $_SERVER['DOCUMENT_ROOT'];.

여기에 기본 auth .htaccess 스크립트가 있습니다.

AuthType Basic
AuthName "Access to the Hidden Files"
AuthUserFile 'C:/xampp/htdocs/ht/.htpasswd'
Require valid-user

로그인 전

여기에 이미지 설명 입력

Afetr 로그인

여기에 이미지 설명 입력


3

Windows에서 XAMPP를 사용하고 라이브 서버에서 .htaccess 파일을 사용하고 XAMPP 개발 시스템에서 개발하려는 경우 다음이 잘 작동합니다!


1) XAMPP를 새로 설치 한 후 Apache가 서비스로 설치되었는지 확인하십시오.

  • XAMPP 제어판을 열고 Apache 모듈 왼쪽에있는 작은 빨간색 "X"를 클릭하면됩니다.
  • 그런 다음 Apache를 서비스로 설치할 것인지 묻습니다.
  • 그런 다음 녹색 확인 표시로 바뀝니다.

2) Apache가 서비스로 설치되면 새 환경 변수를 플래그로 추가하십시오.

  • 먼저 XAMPP 제어판에서 Apache 서비스를 중지하십시오.
  • 다음으로 명령 프롬프트를 엽니 다. (DOS를 시뮬레이트하는 작은 검은 창을 알고 있습니다)
  • 입력 -D "DEV"-k 설정 : "\ Program 파일 (x 86) \ XAMPP \ 아파치 \ 빈 \ httpd.exe가 C"를 .
  • 이렇게하면 나중에 사용할 수있는 환경 변수에 새 DEV 플래그 가 추가 됩니다.

3) Apache 시작

  • XAMPP 제어판을 열고 Apache 서비스를 시작하십시오.

4) 다음 정보로 .htaccess 파일을 만듭니다.

<IfDefine DEV>
  AuthType Basic
  AuthName "Authorized access only!"
  AuthUserFile "/sandbox/web/scripts/.htpasswd"
  require valid-user
</IfDefine>

<IfDefine !DEV>
  AuthType Basic
  AuthName "Authorized access only!"
  AuthUserFile "/home/arvo/public_html/scripts/.htpasswd"
  require valid-user
</IfDefine>

위의 스크립트를 설명하기 위해 여기에 몇 가지 참고 사항이 있습니다.

  • 내 AuthUserFile은 내 설정 및 개인 기본 설정을 기반으로합니다.
  • 내 웹 페이지가 c : \ sandbox \ web \에 있는 로컬 테스트 개발 상자가 있습니다 . 그 폴더 안에는 암호 파일 .htpasswd 를 포함하는 scripts 라는 폴더 가 있습니다 .
  • 첫 번째 항목 IfDefine DEV 가 해당 인스턴스에 사용됩니다. DEV가 설정되면 (위에서 수행 한 작업이며, 대략적인 dev 시스템에서만) 해당 항목을 사용합니다.
  • 그리고 라이브 서버를 사용하는 경우 IfDefine! DEV 가 사용됩니다.

5) 다음 정보를 사용하여 암호 파일 (이 경우 .htpasswd)을 만듭니다.

user : $ apr1 $ EPuSBcwO $ / KtqDUttQMNUa5lGXSOzk.

참고할 몇 가지 사항 ...


그러나 이것은 여전히 ​​절대 경로 ( /home...)를 사용하고 질문은 "상대 경로를 사용하는 방법"을 묻습니다.
sdaau

2

또는 localhost에서 개발하는 경우 (apache 2.4 이상에만 해당) :

<If "%{REMOTE_ADDR} != '127.0.0.1'">
</If>

1

나는 이것이 오래된 질문이라는 것을 알고 있지만 똑같은 것을 검색했으며 아마도 빠른 모바일 솔루션을 찾고있는 다른 많은 사람들이있을 것입니다. 마침내 내가 생각 해낸 것은 다음과 같습니다.

# We set production environment by default
SetEnv PROD_ENV 1

<IfDefine DEV_ENV>
  # If 'DEV_ENV' has been defined, then unset the PROD_ENV
  UnsetEnv PROD_ENV

  AuthType Basic
  AuthName "Protected Area"
  AuthUserFile /var/www/foo.local/.htpasswd
  Require valid-user
</IfDefine>

<IfDefine PROD_ENV>
  AuthType Basic
  AuthName "Protected Area"
  AuthUserFile /home/foo/public_html/.htpasswd
  Require valid-user
</IfDefine>

그러나 이것은 여전히 ​​절대 경로 ( /var...)를 사용하고 질문은 "상대 경로를 사용하는 방법"을 묻습니다.
sdaau

1
예, Apache는 .htaccess파일 위치에 대한 상대 경로를 지원하지 않으므로 해결 방법 입니다. 상대 경로를 사용하는 경우 ServerRoot.
ovi

1

예를 들어 보겠습니다.

애플리케이션은 일부 Linux 서버의 / var / www / myApp 에 있습니다.

.htaccess : /var/www/myApp/.htaccess

htpasswdApp : / var / www / myApp / htpasswdApp . ( .htpasswd 파일에 어떤 이름이든 자유롭게 사용할 수 있습니다)

.htaccess 에서 상대 경로를 사용하려면 다음을 수행하십시오.

AuthType Digest
AuthName myApp
AuthUserFile "htpasswdApp"
Require valid-user

그러나 server_root 디렉토리 에서 파일을 검색합니다 . 하지에서 DOCUMENT_ROOT .

경우에 따라 응용 프로그램이 / var / www / myApp에있는 경우 :

document_root/ var / www / myApp입니다.

server_root/ etc / apache2 // (이 예제에서는 Linux 서버를 사용하기 때문에 )

아파치 구성 파일 ( /etc/apache2/apache2.conf ) 에서 재정의 할 수 있지만 나쁜 생각이라고 생각합니다.

따라서 /var/www/myApp/.htaccess 에서 상대 파일 경로를 사용하려면 server_root 에 암호 파일을 정의해야합니다 .

다음 명령으로 수행하는 것을 선호합니다.

sudo ln -s /var/www/myApp/htpasswdApp /etc/apache2/htpasswdApp

내 명령을 자유롭게 복사하거나 기호 대신 하드 링크를 사용하거나 파일을 server_root에 복사 할 수 있습니다 .


1
아파치는 기본적으로 .ht *로 시작하는 파일에 대한 액세스를 차단하므로 임의의 이름을 사용하지 않는 것이 좋습니다.
cari
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.