mod_rewrite 구문 순서
mod_rewrite에는 처리에 영향을주는 특정 순서 규칙이 있습니다. 어떤 작업을 수행하기 전에 RewriteEngine On
mod_rewrite 처리를 켤 때 지시문을 제공해야합니다. 다른 재 작성 지시문보다 앞에 있어야합니다.
RewriteCond
앞의 RewriteRule
규칙 중 하나를 조건부로 적용합니다. 다음 RewriteRules는 조건부 조건이없는 것처럼 처리됩니다.
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule $/blog/(.*)\.html $/blog/$1.sf.html
이 간단한 경우에 HTTP 참조자가 serverfault.com에서 온 경우 블로그 요청을 특수한 serverfault 페이지로 리디렉션합니다 (우리는 그저 특별한 것입니다). 그러나 위의 블록에 여분의 RewriteRule 줄이있는 경우 :
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule $/blog/(.*)\.html $/blog/$1.sf.html
RewriteRule $/blog/(.*)\.jpg $/blog/$1.sf.jpg
모든 .jpg 파일은 여기에서 온 참조자를 가진 파일이 아닌 특수한 서버 오류 페이지로 이동합니다. 이것은 이러한 규칙을 작성하는 방식의 의도가 아닙니다. 여러 RewriteCond 규칙으로 수행 할 수 있습니다.
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.html /blog/$1.sf.html
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.jpg /blog/$1.sf.jpg
그러나 아마도 더 까다로운 대체 구문으로 수행해야 할 것입니다.
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.(html|jpg) /blog/$1.sf.$2
더 복잡한 RewriteRule에는 처리 조건이 포함되어 있습니다. 마지막 괄호 (html|jpg)
는 RewriteRule에게 html
또는 에 일치하도록 jpg
하고 다시 쓴 문자열에서 일치하는 문자열을 $ 2로 표시 하도록 지시 합니다. 이것은 두 개의 RewriteCond / RewriteRule 쌍을 사용하여 이전 블록과 논리적으로 동일하며 4 개가 아닌 2 개의 행으로 만 수행됩니다.
여러 RewriteCond 줄은 암시 적으로 AND 처리되며 명시 적으로 OR 처리 될 수 있습니다. ServerFault 및 Super User (명시 적 OR)의 리퍼러를 처리하려면
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$) [OR]
RewriteCond %{HTTP_REFERER} ^https?://superuser\.com(/|$)
RewriteRule ^/blog/(.*)\.(html|jpg) /blog/$1.sf.$2
Chrome 브라우저에서 ServerFault 참조 페이지를 제공하려면 (암시 적 AND) :
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*Chrome.*$
RewriteRule ^/blog/(.*)\.(html|jpg) /blog/$1.sf.$2
RewriteBase
다음 RewriteRule
지시문이 처리를 처리 하는 방법을 지정하므로 순서에 따라 다릅니다 . .htaccess 파일에서 매우 유용합니다. 사용되는 경우 .htaccess 파일에서 "RewriteEngine on"아래의 첫 번째 지시문이어야합니다. 이 예제를 보자 :
RewriteEngine On
RewriteBase /blog
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^(.*)\.(html|jpg) $1.sf.$2
이것은 mod_rewrite에게 현재 처리중인 특정 URL이 실제 디렉토리 경로 (/ home / $ Username / public_html / blog) 대신 http://example.com/blog/ 를 통해 도착하여 적절하게 처리한다고 mod_rewrite에 알려줍니다 . 이 때문에 RewriteRule
URL에서 문자열 시작이 "/ blog"뒤에 오는 것으로 간주합니다. 두 가지 다른 방법으로 작성된 동일한 내용이 있습니다. 하나는 RewriteBase이고 다른 하나는 다음과 같습니다.
RewriteEngine On
##Example 1: No RewriteBase##
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule /home/assdr/public_html/blog/(.*)\.(html|jpg) $1.sf.$2
##Example 2: With RewriteBase##
RewriteBase /blog
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^(.*)\.(html|jpg) $1.sf.$2
보시다시피, RewriteBase
재 작성 규칙을 사용 하면 웹 서버가 아닌 웹 사이트 경로를 컨텐츠 로 활용하여 해당 파일을 편집하는 사람들이보다 쉽게 이해할 수 있습니다. 또한 지시문을 더 짧게 만들 수 있으므로 미적 매력이 있습니다.
RewriteRule 일치 구문
RewriteRule 자체에는 문자열 일치를위한 복잡한 구문이 있습니다. 다른 섹션에서 플래그 ([PT]와 같은 것)를 다룰 것입니다. Sysadmin은 맨 페이지 를 읽는 것보다 예제를 통해 더 자주 배우기 때문에 예제를 제공하고 그 기능을 설명합니다.
RewriteRule ^/blog/(.*)$ /newblog/$1
.*
구조는 단일 문자와 일치 ( .
) 0 번 이상 ( *
). 괄호로 묶으면 $ 1 변수와 일치하는 문자열을 제공하도록 지시합니다.
RewriteRule ^/blog/.*/(.*)$ /newblog/$1
이 경우 첫 번째. *는 괄호로 묶지 않으므로 다시 쓴 문자열에는 제공되지 않습니다. 이 규칙은 새 블로그 사이트에서 디렉토리 레벨을 제거합니다. (/blog/2009/sample.html은 /newblog/sample.html이됩니다).
RewriteRule ^/blog/(2008|2009)/(.*)$ /newblog/$2
이 경우 첫 번째 괄호 식은 일치하는 그룹을 설정합니다. $ 1이되므로 필요하지 않으므로 다시 쓴 문자열에는 사용되지 않습니다.
RewriteRule ^/blog/(2008|2009)/(.*)$ /newblog/$1/$2
이 경우, 재 작성된 문자열에 $ 1을 사용합니다.
RewriteRule ^/blog/(20[0-9][0-9])/(.*)$ /newblog/$1/$2
이 규칙은 문자 범위 를 지정하는 특수한 대괄호 구문을 사용합니다 . [0-9]는 0에서 9까지의 숫자와 일치합니다.이 특정 규칙은 2000 년에서 2099 년까지의 연도를 처리합니다.
RewriteRule ^/blog/(20[0-9]{2})/(.*)$ /newblog/$1/$2
이는 이전 규칙과 동일한 작업을 수행하지만 {2} 부분은 이전 문자 (이 경우 대괄호 표현식)와 두 번 일치하도록 지시합니다.
RewriteRule ^/blog/([0-9]{4})/([a-z]*)\.html /newblog/$1/$2.shtml
이 경우 두 번째 일치 표현식의 소문자와 일치하며 가능한 한 많은 문자에 해당됩니다. 이 \.
구문은 이전 예제의 특수 문자가 아니라 실제 기간으로 기간을 처리하도록 지시합니다. 그러나 파일 이름에 대시가 있으면 중단됩니다.
RewriteRule ^/blog/([0-9]{4})/([-a-z]*)\.html /newblog/$1/$2.shtml
파일 이름을 대시로 묶습니다. 그러나 -
대괄호 표현식의 특수 문자와 마찬가지로 표현식 의 첫 번째 문자 여야합니다 .
RewriteRule ^/blog/([0-9]{4})/([-0-9a-zA-Z]*)\.html /newblog/$1/$2.shtml
이 버전은 파일 이름에 문자, 숫자 또는 문자가 포함 된 모든 파일 이름을 트랩합니다 -
. 대괄호 표현식에서 여러 문자 세트를 지정하는 방법입니다.
RewriteRule 플래그
다시 쓰기 규칙의 플래그에는 여러 가지 특별한 의미와 사용 사례가 있습니다.
RewriteRule ^/blog/([0-9]{4})/([-a-z]*).\html /newblog/$1/$2.shtml [L]
플래그는 [L]
위 식의 끝에 있습니다. 쉼표로 구분하여 여러 플래그를 사용할 수 있습니다. 링크 된 문서는 각각에 대해 설명하지만 여기에 있습니다.
L = 마지막. 이 항목이 일치하면 RewriteRules 처리를 중지하십시오. 주문 카운트!
C = 체인. 다음 RewriteRule 처리를 계속하십시오. 이 규칙이 일치하지 않으면 다음 규칙이 실행되지 않습니다. 이것에 대해서는 나중에 더 설명하겠습니다.
E = 환경 변수를 설정합니다. Apache에는 웹 서버 동작에 영향을 줄 수있는 다양한 환경 변수가 있습니다.
F = 금지 이 규칙이 일치하면 403-Forbidden 오류를 반환합니다.
G = 사라졌습니다. 이 규칙이 일치하면 410- 간 오류를 반환합니다.
H = 핸들러 요청이 지정된 MIME 유형 인 것처럼 처리되도록합니다.
N = 다음. 규칙을 다시 시작하고 다시 일치시킵니다. 조심해! 루프가 발생할 수 있습니다.
NC = 사례가 없습니다. 허용jpg
jpg와 JPG 모두 일치합니다.
NE = 탈출 없음. 특수 문자 (.? # & 등)를 16 진수 코드로 다시 쓰지 못하게합니다.
NS = 하위 요청이 없습니다. 서버 측 포함을 사용하는 경우 포함 된 파일과 일치하지 않습니다.
P = 프록시. mod_proxy가 규칙을 처리하도록합니다. 웹 서버가 컨텐츠를 가져 와서 예약하기 때문에 다른 서버의 컨텐츠를 투명하게 제공합니다. 잘못 작성된 플래그는 웹 서버를 개방형 프록시로 바꾸고 그게 나쁘기 때문에 위험한 플래그입니다.
PT = 통과. RewriteRule 일치에서 별명 명령문을 고려하십시오.
QSA = QSAppend. 원래 문자열에 쿼리가 포함 된 경우 ( http://example.com/thing?asp=foo) 원래 쿼리 문자열을 다시 작성된 문자열에 추가하십시오. 일반적으로 폐기됩니다. 동적 컨텐츠에 중요합니다.
R = 리디렉션 지정된 URL로 HTTP 리디렉션을 제공하십시오. 정확한 리디렉션 코드를 제공 할 수도 있습니다 [R = 303]. 와 매우 유사하며 RedirectMatch
더 빠르며 가능한 경우 사용해야합니다.
S = 건너 뛰기 이 규칙을 건너 뛰십시오.
T = 유형. 리턴 된 컨텐츠의 MIME 유형을 지정하십시오. AddType
지시문 과 매우 유사합니다 .
내가 RewriteCond
하나의 규칙에만 적용되는 방법을 알고 있습니까? 글쎄, 당신은 체인을 통해 그 문제를 해결할 수 있습니다.
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.html /blog/$1.sf.html [C]
RewriteRule ^/blog/(.*)\.jpg /blog/$1.sf.jpg
첫 번째 RewriteRule에는 체인 플래그가 있으므로 두 번째 다시 쓰기 규칙은 첫 번째 할 때, 즉 이전 RewriteCond 규칙이 일치 할 때 실행됩니다. Apache 정규식으로 인해 뇌가 아프면 편리합니다. 그러나 첫 번째 섹션에서 가리키는 올인원 방식은 최적화 관점에서 빠릅니다.
RewriteRule ^/blog/([0-9]{4})/([-0-9a-zA-Z]*)\.html /newblog/$1/$2.shtml
플래그를 통해 더 간단하게 만들 수 있습니다.
RewriteRule ^/blog/([0-9]{4})/([-0-9a-z]*)\.html /newblog/$1/$2.shtml [NC]
또한 일부 플래그는 RewriteCond에도 적용됩니다. 특히, NoCase.
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$) [NC]
"ServerFault.com"과 일치합니다