아파치 Auth 꼼수 하나

딸내미 홈페이지에 통째로 걸어놓은 Basic Auth때문에 Blog API로 글을 쓰는 것 역시 막혀있었다. 사진을 하나씩 골라 크기를 조정하고 정성스레 사진을 올리던 아내는 내가 Windows Live Editor로 사진을 대량으로 휘리릭 옮겨버리는 것을 보고 그것을 하기를 원했다.

사람이 아닌 것들이 홈페이지를 무작정 긁어가는 것이 싫어서 걸어놓은 비밀번호라 사람에겐 별 의미가 없지만 이를 해결하기 robots.txt을 적어줄까 하다가, 특정 url 즉, http://… /api 만 비밀번호를 안 물어보도록 설정하기 시작했다. 원하는 바는 한개의 예외를 제외한 나머지 요청에 Require valid-user를 걸어주고 싶은 것임.

1. .htaccess에 FilesMatch를 이용하면 되리라 생각.

2. FilesMatch에 negation이 들어간 regex가 제대로 해석 되지 않는듯함.

3. 혹자가 negation대신 Negative lookahead 를 쓰면 된다고 함. 그게 뭔지 몰라 알아보고 적용. 역시 안됨.

4. 그럼 api를 뺀 나머지 정상 url의 prefix를 다 regex로 하려고 시도. 역시 안됨. regex를 아예 못 알아먹는 것은 아니나 미묘하게 안됨.

5. 혹자가 Files Directive를 겹쳐서 쓰면 뒤에 오는 것이 앞에 있는 것을 덮어 쓴다고 하여 시도. 안 됨. 호스팅업체는 Directory, Location은 모두 건드리지 못하게 하고, .htaccess만 제공하기때문에 달리 해 볼 여지가 없음.

6. Allow from all과 Satisfy any 조합시도. 실패.

7. Allow from 집의 dynamic address로 시도. 호스팅업체에서 reverse dns lookup 지원 안함.

8. SetEnvIf 를 써서 Request_URI 가 "api$" 이면 env셋팅 하고 Allow from env= 사용. 이제 된다. 만세!

 

결과물

AuthType Basic
AuthName "blah blah"
AuthUserFile path_to_passwd_file

SetEnvIf Request_URI "^/api$" api_req

Require valid-user
Deny from all
Allow from env=api_req
Satisfy any