.htaccess의 예

php_flag register_globals on
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} !^(www)\.domain\.co\.kr$ [NC]
RewriteRule (.*) http://www.domain.co.kr/$1 [R=301,L]
ErrorDocument 401 http://www.domain.co.kr/401error.html


간단하게 요정도?
난 RewriteCond와 RewriteRule에 대해서만 언급해보려한다.
RewriteEngine On은 Rewrite모듈의 사용을 위해 기본적으로 On으로 설정해두는것이 좋다.
RewriteBase는 기본적으로 .htaccess가 위치안 물리적 경로로 설정하지만 Rewrite의 쓰임이 너무 광범위하기에 다르게 쓰이는 경우도 많다.
그 외에 RewriteOptions, RewriteLog, RewriteLogLevel, RewriteLock, RewriteMap등은 심화과정이므로 취급하지 않습니다 ^^;;

이 글은 완벽하지 않다. 잘쓴 글도 아니고 잘 되어있는 글도 아니다.
하지만 당신이 컴퓨터에 대한 열정이 있고 그만큼의 노력이 있었으며 독학에 재능이 있다면 이정도의 글로도 만족할것이라 믿는다. (쓸데없는 잡담이 너무 많은거 뺴고... ㅡㅡ;;)

이제 본론으로 고고-


Rewrite모듈은 URL Rewrite 엔진일까?

RewriteCond와 RewriteRule의 기본 형태
RewriteCond와 RewriteRule의 기본 형태는 이렇다.
RewriteCond     TestString     CondPattern
RewriteRule     Pattern     Substitution

RewriteCond는 RewriteRule을 위해 존재하기도 하지만 RewriteRule은 RewriteCond를 위해 존재하기도 한다.
하지만 순서는 거의 대부분 Cond후에 Rule이 온다.
Cond는 생략하고 Rule만 있는경우도 많다.
기본형태는 이러하지만 RewriteCond만 있을수도 있고 RewriteRule만 있을수도 있으며 둘다 여러개일수도 있고 둘중 하나만 여러개일수도 있다. 순서도 맘대로라서 엄청나게 다양한 수법이 가능하다 ㅋ

처리 경로(흐름)
제일 먼저 Rule의 Pattern에 어긋나지 않는다면 Cond의 TestString으로 가서 조건검사를 시작한다. 그후 CondPattern을 지나 Substitution으로 처리되어 조건에 만족하게 된다.

다음을 보자

...
RewriteRule     Pattern     Substitution

RewriteCond     TestString     CondPattern
RewriteRule     Pattern     Substitution

RewriteRule     Pattern     Substitution
...

위의 경우 Cond와 Rule이 막 써있다 ㅋ 두개 이상의 Rule이 있을경우 위  Rule이 처리, 적용된 결과가 다시 두번째 Rule에 적용된다. 또 아래 Rule이 있다면 그 결과가 다시 검사될것이다.
혹은. 위의 조건에 맞지 않는 값이라면 다음 Rule로 넘긴다.


이하부터는 패턴, 대용(대체), 조건패턴등의 한글화를 섞어 쓰겠다.
Cond는 조건의 약자이고 Rule은 그대로 규칙, 법이다.

특수 문자
프 로그래밍을 하면서 그 프로그램 내부 코드나 명령어로 쓰이고 있어서 쓰지 못하는 문자가 많다. 여기서도 마찬가지이다. 하지만 어디서나 존재하는 Escape문자 있으니 여기서는 "\"(역슬래쉬(원))표시가 쓰인다. 보통 .이 잘못쓰일것을 대비하여 \.로 쓰는게 보통이다.
예 : domain.co.kr   ==>   domain\.co\.kr
주로 점.이나 대괄호[], 괄호()등에 쓰인다.

RewriteCond
RewriteCond의 기본 구문은 이미 위에서도 나왔다.
그곳 Test스트링부분에 $N이나 %N이 쓰인다면 역참조 기능을 제공하게된다.
여기서 N은 (1<=N<=9)이다.
$N의 경우 현재 처리되고있는 Rule에서 가르키고 있는 패턴이 그룹으로 묶여 제공된다.
$N을 하나의 변수처럼 사용할수 있게되는것이다.
아래도 나와있지만 괄호로 그룹을 묶은 부분이 변수로 사용된다.

RewriteCond   %{HTTP_HOST}             ^[^.]+\.domain\.co\.kr$
RewriteRule   ^(.+)                     %{HTTP_HOST}$1 [C]
RewriteRule   ^([^.]+)\.domain\.co\.kr(.*)   /home/$1/htdocs$2

위 예제의 경우 도메인 앞의 URI를 $1로 그 뒤 경로를 $2로 지정하여 특정 디렉토리의 내용을 읽도록 하는 내용이다.
이것을 짧게 한줄로 고쳐보자면

RewriteRule ^([^.]+)\.domain\.co\.kr(.*) /home/$1/htdocs$2

요정도?

%N은 현재 처리중인 Cond에서 가르키고있는 조건과 일치한 패턴이 그룹으로 묶여 제공된다.
이건 잘 안쓰이는것같아서 정말 잘쓰이는 다음으로 패쓰~

%{Name}의 경우 해당 서버의 변수를 가지고 올수있다.
변수의 개수는 정말 엄청나게 많다. 하지만 자주 쓰이는 변수들은 아래를 통해서 한번 확인해보세요 ^^

Server Name : domain.com
Protocol : HTTP/1.1
Server Port : 80
Method : GET
Servlet Path : /index.php
Remote Host : 192.168.0.4
Remote Port : -1
Remote Address : 192.168.0.4
Content Length : 0
Header_Accept : text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Header_User-Agent : Mozilla/5.0 (Windows; U; Windows NT 5.1; ko; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12
Header_Referer : null
Local Name : domain.com
Local Port : 80
Locale : ko_KR
Scheme : http
Request URI : /index.php

Request URL : http://domain.com/index.php


CondPattern
CondPattern에서 쓰이는 내부 명령어? 특수명령어?등을 알아보도록하자

-d     =>     디렉토리를 뜻한다.
결론적으로 Test스트링이 디렉토리를 가리키거나 포함하고 있을때 처리된다.
-f     =>     파일을 뜻한다.
Test스트링이 파일을 가리키거나 포함하고 있을때 처리된다.
-l     =>     심볼릭링크를 뜻한다.
Test스트링이 심볼릭링크를 가리키거나 포함하고 있을때 처리된다.
심볼릭 링크가 뭐냐고 물으신다면 리눅스나 유닉스를 공부해보세요 ^^ 라고 답하고 싶다^^

그리고 느낌표(!)는 부정을 뜻한다.

 

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ http://test.domain.co.kr/$1

위의 예제는 Request내용이 디렉토리나 파일을 가르키고 있지 않을경우 저쪽 사이트로 돌리라는 뜻. ^^
$1로 하위주소는 유지하려하고 있습니다 ^^

[Flag]
라인마다 Flag라 불리우는 깃발을 달수가 있습니다. 일종의 옵션으로 작용합니다 ^^

F     =>     403에러 Forbidden페이지로 된다.
L     =>     Last라는 뜻입니다. 위의 Cond들은 여기까지만 적용된다
아래부터는 새로 시작 되겠지용~
N     =>     새로운 Rule이 시작된다는 깃발.
QSA     =>     Cond의 대용을 지난 결과에 덧붙인다.
NE     =>     Out될 값에 특수문자가 HexCode로 되어 포함되어있는경우
R     =>     리다이렉션. 무조건 넘긴다. 뒤 주소로 넘긴다는 뜻이지요 ^^
NC     =>     대소문자 구별없다는 뜻.
OR     =>     프로그래밍의 or와 비슷하다.


아래를 참고하시죠 ^^

RewriteCond %{REMOTE_HOST}  ^domain.*  [OR]
RewriteCond %{REMOTE_HOST}  ^DOMAIN.*  [OR]
RewriteCond %{REMOTE_HOST}  ^DOMAIN2.* [NC]
RewriteRule ^(.*)$ http://www.domain.co.kr/$1 [R,L]

domain나 DOMAIN나 DOMAIN2나 domain2로부터 접속한 접속에 대하여 리다이렉트한다. http://www.domain.co.kr/로 접속하게된다. 보통 IP주소를 적게되겠다.

RewriteRule
여기부터는 아주 간단간단하게... ㅡㅡ;

텍스트

.     =>     ?과 같습니다. 무엇이든 하나의 문자를 뜻합니다. A가 될수도 있고 Z가 될수 있다. 반드시 한글자.
[A]     =>     역시 하나의 문자가 올수 있다는 뜻. ex) a[eo]t => aot 혹은 aet
[^A]     =>     문자는 올수 없다는 뜻~ A부터 Z까지~



 

?     =>     0개 또는 1개의 텍스트.
*     =>     0개 또는 1개 이상의 텍스트.
+     =>     1개 이상의 텍스트. 0은 될수 없다.



그룹

(텍스트)     =>     위의 텍스트에 속한 세가지를 조합하여 쓸수 있다
예로 (..)는 두글자라는 거지요 ^^
몇번째 그룹이냐에 따라서 위에 설명한 $N의 변수로 불러 쓸수있니다.



Anchors

^     =>     줄의 시작을 나타낸다 ex) ^a => a로 시작
$     =>     줄의 끝을 말한다. ㄷㅌ) a$ => a로 끝



2008/03/31 21:10 2008/03/31 21:10
htaccess란?

.htaccess (hypertext access)는 Apache 웹 서버의 디렉토리 레벨을 설정하는 기본 파일입니다. .htaccess는 한 특정 디렉토리에 위치하며, 모든 하위 디렉토리를 포함한 해당 디렉토리에 영향을 미칩니다. 이 파일이 위치한 특정 폴더에 사용자가 정의한 Request 기능을 적용합니다. 파일 이름은 .(dot)으로 시작하기 때문에 유닉스 계열의 운영체제에서는 숨김 파일로 저장됩니다.

.htaccess의 파일명을 다르게 사용하고 싶다면, AccessFileName 지시어를 사용하여 변경할 수있습니다. 예를 들어, .config 파일명을 사용하려면 서버 설정파일(httpd.conf)에 다음과 같이 추가 해야합니다.

AccessFileName .config


AllowOverride 지시어가 이 파일에 나올 수 있는 내용을 결정합니다. 이 지시어는 .htaccess 파일에서 허용하는 지시어 분류를 지정합니다.

.htaccess가 필요한 경우

일반적으로 주서버파일에 접근할 수 있는 경우 .htaccess 파일을 사용하면 안됩니다. 예를 들어 사용자 인증이 항상 .htaccess 파일에 있어야 한다는 것은 잘못 알려는 오해입니다. 이는 사실이 아닙니다. 주서버설정에 사용자 인증을 적을 수 있고, 사실 이 방법을 권장합니다. .htaccess 파일은 컨텐츠 제공자가 디렉토리별로 서버 설정을 다르게하고 싶지만 서버 시스템에 루트 권한이 없는 경우에 사용합니다. 서버 관리자가 설정을 자주 변경하고 싶지 않은 경우 일반 사용자가 직접 .htaccess 파일을 수정하도록 허용하는 것이 바람직합니다. 예를 들어, 한 컴퓨터에 여러 사용자 사이트를 서비스하는 ISP에서 사용자가 자신의 설정을 변경하고 싶은 경우가 있습니다.

그러나 일반적으로 .htaccess 파일을 가급적 피해야 합니다. .htaccess 파일에서 허용하는 지시어는 주설정파일의 <Directory> 섹션과 같은 효과가 있습니다. 다음 두 가지 큰 이유 때문에 .htaccess 파일 사용을 피해야 합니다.

AllowOverride가 .htaccess 파일을 사용하도록 허용하면, Apache는 디렉토리마다 .htaccess 파일을 찾습니다. 그래서 .htaccess 파일은 문서를 요청할 때마다 읽어들입니다. 게다가 적용해야하는 전체 지시어를 모으기위해 Apache는 모든 상위 디렉토리에서 .htaccess 파일을 찾습니다. 그래서 /www/htdocs/example 디렉토리에 있는 파일을 요청하면 Apache는 다음 파일들을 찾아야 합니다.
/.htaccess
/www/.htaccess
/www/htdocs/.htaccess
/www/htdocs/example/.htaccess
그래서 그 디렉토리에 있는 파일을 접근할 때마다 설정파일이 전혀 없어도 파일 시스템을 4번 더 접근해야 합니다.
사용자에게 서버 설정 변경 권한을 주면 당신이 감당할 수 없는 변화가 일어날 수 있습니다. 사용자에게 이런 권한을 줄 지 곰곰이 생각해 보세요. 또, 사용자가 원하는 것보다 적은 권한을 주면 기술지원요청이 들어옵니다. 사용자에게 가능한 권한 수준을 명확히 알려야합니다. 사용자에게 AllowOverride를 어떻게 설정하였는지 정확히 알리고 관련 문서를 제공하면 앞으로 혼란을 피할 수 있습니다.


.htaccess 사용법

.htaccess에서 가장 많이 사용되는 기능은 Rewrite engine입니다. Rewrite는 사이트의 URL을 순회시켜주는 아주 유용한 기능입니다. 예를 들어, http://localhost/naver로 접속을 했을 때 http://www.naver.com로 접속이 가능하도록 할 수있습니다.

.htaccess에서 Rewrite engine의 모든 기능을 사용하기 위해서는 파일 상단에 "RewriteEngine On"을 위치시켜 주어야 합니다.

RewriteEngine On
...
..
.......
.htaccess에서 사용 가능한 기본적인 Rewrite 구문은 RewriteRule과 RewriteCond입니다. RewriteRule은 URL을 전환해주는 가장 기본적이고 가장 중요한 구문입니다. RewriteCond는 URL에 입력된 조건을 입력하는 구문입니다.

RewriteRule과 RewriteCond의 기본적인 패턴은 다음과 같습니다.
RewriteRule Pattern Substitution
RewriteCond TestString CondPattern
RewriteCond는 RewriteRule을 위해 존재하기도 하지만 RewriteRule은 RewriteCond를 위해 존재하기도 합니다. 하지만 순서는 거의 대부분 RewriteCond 후에 RewriteRule이 옵니다. 또한 RewriteCond를 생략하고 바로 RewriteRule을 사용하는 것도 가능합니다. 다음 예시를 봅시다.

......
RewriteEngine On
......
RewriteRule Pattern Substitution
 
RewriteCond TestString CondPattern
RewriteRule Pattern Substitution
 
RewriteRule Pattern Substitution
......
두 개 이상의 Rule이 있을 경우 위쪽에 위치한 RewriteRule이 처리하여 적용된 결과가 다시 두번째 RewriteRule에 적용이 됩니다.

.htaccess에서의 특수문자
프로그래밍을 하면서 그 프로그램 내부 코드나 명령어로 쓰이고 있어서 쓰지 못하는 문자가 있습니다. 그래서 역슬래시(\)를 사용하여 모든 문자를 사용할 수 있습니다. 주로 점(dot, .)이나 대괄호([]), 괄호( ()) 등에 쓰입니다.

정규표현식 기초
.: 다수의 한문자

?: 0개 이상의 한문자

*: 0개 이상의 문자 또는 문자열

+: 1개 이상의 문자 또는 문자열

(chars): (, ) 안의 문자또는 문자열을 그룹으로 묶습니다. 이 문자그룹은 Substitution(return URL)에서 $N 의 변수로 활용할수 있습니니다.

^: 문자열의 첫문(열)을 지정합니다.

$: 문자열의 끝 문자(열)을 지정합니다.

\(역슬래쉬): 정규표현식에서 특별한 의미로 사용되는 문자의 특수기능을 제거합니다.(예:(, ), [, ], . 등)

{n}: 정확히 n번 반복

{n,}: n번 이상 반복

{n,m}: n 이상 m 이하 반복

[chars]: 문자들의 범위 또는 표현할 수 있는 문자들을 설정합니다.

예) [a-z]: a 부터 z 까지의 소문자, [tT] : 소문자 t 또는 대문자 T
정규표현식 단축표현들
[:alpha:] : 알파벳. [a-zA-Z] 와 같은 표현
 
[:alnum:] : 알파벳과 숫자. [a-zA-Z0-9] 와 같은 표현
 
[:digit:] : 숫자 [0-9] 와 같은 표현
 
[:upper:] : 대문자. [A-Z] 와 같은 표현
RewriteCond, RewriteRule
RewriteCond와 RewriteRule의 기본 구문은 이미 위에서 설명하였습니다.
TestString 부분에 $N이나 %N이 쓰인다면 역참조 기능을 제공하게 됩니다. 여기서 N은 1≤N≤9입니다.
RewriteRule에서 $N을 사용하게 되면 하나의 변수처럼 패턴에 일치하는 문자열을 사용할 수 있습니다.
아래와 같이 사용이 가능합니다.
RewriteCond %{HTTP_HOST} ^[^.]+\.domain\.co\.kr$
RewriteRule ^(.*?) %{HTTP_HOST}$1 [C]
RewriteRule ^([^.]+)\.domain\.co\.kr(.*) /home/$1/htdocs$2
위 예제의 경우 도메인 앞의 URI를 $1, 그 뒤 경로를 $2로 지정하여 특정 디렉토리의 내용을 읽도록 합니다.
위의 것을 짧게 사용하고 싶다면 아래와 같이 가능합니다.
RewriteRule ^([^.]+)\.domain\.co\.kr(.*) /home/$1/htdocs$2
RewriteCond
RewriteCond에서 쓰이는 명령어를 알아보도록 하겠습니다.
-d: 디렉토리를 의미합니다. TestString이 이렉토리를 가리키거나 포함하고 있을 때 처리됩니다.

-f: 파일을 의미합니다. TestString이 파일을 가리키더나 포함하고 있을 때 처리됩니다.

-l: 심볼릭링크를 의미합니다. TestString이 심볼릭링크를 가리키거나 포함하고 있을 때 처리됩니다.

마지막으로 느낌표(!)는 부정을 뜻합니다.
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ http://test.domain.co.kr/$1
위 예제는 Request 내용이 디렉토리나 파일을 가리키고 있지 않을 경우 저쪽 사이트로 접속하게 만들라는 의미입니다. $1로 하위주소는 유지하고 있습니다.

Flag
라인마다 Flag라 불리는 기능을 사용할 수 있습니다.
F: 403 Forbidden 에러 페이지를 출력합니다. 접근 권한이 없다는 의미입니다.

L: Last(마지막)를 의미합니다. 이곳에서 Rewrite가 끝납니다.

N: 새로운 Rule이 시작된다는 의미입니다.

QSA: Cond의 내용을 지난 결과에 덧붙입니다.

NE: Out 될 값에 특수문자가 HexCode로 되어 포함되어 있는 경우

R: Redirection. 무조건 넘깁니다. 뒤 주소로 넘긴다는 의미입니다.

NC: 대소문자를 구별하지 않습니다.

OR: 프로그래밍의 or와 비슷합니다.
위의 Flag들을 사용하여 아래와 같은 예제가 탄생했습니다!
RewriteCond %{REMOTE_HOST}  ^domain.*  [OR]
RewriteCond %{REMOTE_HOST}  ^DOMAIN.*  [OR]
RewriteCond %{REMOTE_HOST}  ^DOMAIN2.* [NC]
RewriteRule ^(.*)$ http://www.domain.co.kr/$1 [R,L]
domain, domain2, DOMAIN, DOMAIN2로부터 접속한 경우 Redirect합니다. http://www.domain.co.kr로 접속하게 됩니다.

지금까지 Apache 웹 서버에서 .htaccess 파일을 이용하는 방법과 그 중에서 Rewrite 기능을 사용하는 방법에 대해서 알아보았습니다. 긴 글을 읽어주신 여러분께 감사합니다 ^^



[원문] http://www.beneglo.com/45
2008/03/31 21:09 2008/03/31 21:09

레지스트리 설정 위치

운영체제/Windows 2008/03/15 21:35 posted by zekill

#신뢰 사이트
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Domains\bystory.co.kr]
"http"=dword:00000002

#쿠키 허용
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\P3P\History\bystory.co.kr]
@=dword:00000001

#팝업 허용
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\New Windows\Allow]
"*.bystory.co.kr"=hex:

#사용자 정보
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion]
"RegisteredOrganization"="우리집"
"RegisteredOwner"="zekill"


위 내용을 파일명.reg 로 만들어서 실행시키면 설정대로 인터넷 옵션이 변경된다.
동의하에 강제로 변경하는 프로그램이라든지 할때 요 위치를 변경하는 코드를 만들어도 된다.




Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Domains\bystory.co.kr]
"http"=dword:00000002

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\P3P\History\bystory.co.kr]
@=dword:00000001

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\New Windows\Allow]
"*.bystory.co.kr"=hex:

2008/03/15 21:35 2008/03/15 21:35