Apache에서 리디렉션, URL 변경 또는 HTTP를 HTTPS로 리디렉션-Mod_Rewrite 규칙에 대해 알고 싶지만 물어보기가 쉽지 않은 모든 것


264

이것은 Apache의 mod_rewrite에 대한 정식 질문 입니다.

요청 URL을 변경하거나 원래 요청한 것과 다른 URL로 사용자를 리디렉션하는 것은 mod_rewrite를 사용하여 수행됩니다. 여기에는 다음과 같은 것들이 포함됩니다 :

  • HTTP를 HTTPS로 (또는 다른 방법으로) 변경
  • 더 이상 존재하지 않는 페이지에 대한 요청을 새로운 대체품으로 변경
  • URL 형식 수정 (예 :? id = 3433 ~ / id / 3433)
  • 달과 태양 아래 가능한 모든 것을 기반으로 리퍼러와 브라우저를 기반으로 다른 페이지를 표시합니다.
  • URL로 엉망인 모든 것

Mod_Rewrite 규칙에 대해 알고 싶었지만 묻기가 두려웠습니다!

mod_rewrite 규칙 작성 전문가가 되려면 어떻게해야합니까?

  • mod_rewrite 규칙의 기본 형식과 구조는 무엇입니까?
  • 어떤 정규 표현식의 형태 / 풍미를 제대로 파악해야합니까?
  • 다시 쓰기 규칙을 작성할 때 가장 흔히 발생하는 실수는 무엇입니까?
  • mod_rewrite 규칙을 테스트하고 확인하는 좋은 방법은 무엇입니까?
  • 내가 알아야 할 mod_rewrite 규칙의 SEO 또는 성능 영향이 있습니까?
  • mod_rewrite가 작업에 적합한 도구처럼 보이지만 그렇지 않은 일반적인 상황이 있습니까?
  • 몇 가지 일반적인 예는 무엇입니까?

규칙을 테스트 할 장소

htaccess로 테스터 웹 사이트는 규칙에 놀러하고이를 테스트 할 수있는 좋은 장소입니다. 또한 디버그 출력을 보여 주므로 일치하는 것과 그렇지 않은 것을 볼 수 있습니다.


9
이 질문의 기본 개념은보다 일반 사용자를 미치게 만드는 모든 끝없는 mod_rewrite 질문에 대한 긴밀한 길을 제시하는 것입니다. 이것은 serverfault.com/questions/49765/how-does-subnetting-work 에서 서브넷으로 수행 한 것과 매우 유사합니다 .
Kyle Brandt

1
또한, 나는이 질문 에 대해 너무 많은 투표를 원하지 않기 때문에 대답에 가야합니다. 나는 내가 바라는 것에 대해 포스터가 완전한 크레딧을 얻고 있는지 확인하기 위해 CW를 원하지 않습니다 . 모든 mod_rewrite 질문을 끝내기위한 mod_rewrite 답변 입니다.
Kyle Brandt

4
죄송합니다. 질문을 올렸습니다. ;-) mod-rewrite태그 검색 / 필터 의 상단에 (또는 근처에) 표시되어야한다고 생각합니다 .
Steven 월요일

다른 사람 (tm)은 일반적인 사용 사례를 처리해야합니다. 나는 그것을 정의하기에 충분히 그들을 모른다.
sysadmin1138

아마도이 질문은 경로를 더 짧게 만들기 위해 mod-rewrite 태그 위키에 연결되어야합니다.
beldaz

답변:


224

mod_rewrite 구문 순서

mod_rewrite에는 처리에 영향을주는 특정 순서 규칙이 있습니다. 어떤 작업을 수행하기 전에 RewriteEngine Onmod_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에 알려줍니다 . 이 때문에 RewriteRuleURL에서 문자열 시작이 "/ 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 = 사례가 없습니다. 허용jpgjpg와 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"과 일치합니다


9
잘 했어. [filler]
EEAA

3
아주 좋고 mod_rewrite정규 표현식 프라이머. +1.
Steven 월요일

3
그것은이 알고 때로는 유용 RewriteCond실제로 처리 한 후RewriteRule일치합니다. "RewriteRule 이전의 RewriteCond로 인해 하나의 규칙이 조건부로 적용됩니다."라고 말하는 맨 위 근처에 "나중에 더 자세히"라고 말하고 싶을 수도 있습니다. 정규식이 Perl 호환 정규식이라고 언급 할 수 있습니다. 또한 "... RewriteRule은 문자열 시작으로 간주합니다 ..."에서 외부 아포스트로피가 있습니다.
Dennis Williamson

2
RewriteRule ^/blog/.*/(.*)$ /newblog/$1첫 번째 디렉토리 구성 요소 와 일치하지 않습니다 . 기본적으로 재 작성은 욕심입니다. /.*/(.*)는 / 1 / (2) / 및 / 1 / 2 / 3 / 4 / 5 / (6) / 모두와 일치하므로 첫 번째 경로 만 일치 시키려면 / [^ /] * /가 필요합니다. 구성 요소.
adaptor

1
@ sysadmin1138,이 대답은 좋은 그러나 그 플래그가 작동하는 방법을 명확하지 않기 때문에 당신이 예제와 함께 플래그 E, N, NS, P, PT 및 S에 더 정교한 경우가 더 나을 수 있다고 생각 등
Pacerier

39

mod_rewrite 규칙의 기본 형식과 구조는 무엇입니까?

이 점에 대해서는 sysadmin1138의 탁월한 답변을 연기하겠습니다.

어떤 정규 표현식의 형태 / 풍미를 제대로 파악해야합니까?

sysadmin1138에 의해 요약 된 구문 순서, 구문 일치 / 정규 표현식 및 RewriteRule 플래그 외에도 mod_rewrite는 HTTP 요청 헤더 및 Apache 구성을 기반으로 Apache 환경 변수를 노출한다고 언급합니다.

mod_rewrite에 사용할 수있는 포괄적 인 변수 목록을 보려면 AskApache의 mod_rewrite 디버그 자습서 를 권장 합니다.

다시 쓰기 규칙을 작성할 때 가장 흔히 발생하는 실수는 무엇입니까?

RewriteRule과 관련된 대부분의 문제는 PCRE 구문 / 실패에 대한 오해로 인해 특수 문자를 올바르게 이스케이프하거나 일치하는 데 사용되는 변수의 내용에 대한 통찰력이 부족합니다.

일반적인 문제 및 권장되는 문제 해결 :

  • 500-내부 서버 오류 - 존재하는 경우 구성 파일에서 Windows 캐리지 제어 제거 , mod_rewrite가 사용 가능한지 확인 ( IfModule이 시나리오를 피하기 위해 조건부 지시문 랩 ), 지시문 구문 점검, 문제점이 식별 될 때까지 지시문 주석 처리
  • 리디렉션 루프 -RewriteLog 및 RewriteLogLevel을 사용하고 문제가 식별 될 때까지 지시문을 주석 처리하십시오.

mod_rewrite 규칙을 테스트하고 확인하는 좋은 방법은 무엇입니까?

먼저, 일치시킬 환경 변수의 내용을 살펴보십시오. PHP를 설치 한 경우 응용 프로그램에 다음 블록을 추가하는 것만 큼 간단합니다.

<?php
  var_dump($_SERVER);
?>

... 그리고 개발 서버에서 테스트하기 위해 규칙을 작성하고 Apache ErrorLog 파일 에서 일치하지 않는 일치 또는 활동을 기록하십시오 .

보다 복잡한 규칙의 경우 mod_rewrite의 RewriteLog지시문을 사용 하여 활동을 파일에 기록하고 설정하십시오.RewriteLogLevel 3

내가 알아야 할 mod_rewrite 규칙의 SEO 또는 성능 영향이 있습니까?

AllowOverride allApache가 .htaccess각 요청마다 파일 및 구문 지시문을 확인해야하므로 서버 성능에 영향을줍니다. 가능하면 사이트의 VirtualHost 구성에 모든 지시문을 유지하거나 .htaccess필요한 디렉토리에 대해서만 재정의를 활성화하십시오 .

Google의 웹 마스터 가이드 라인에는 "일반적으로 '클로킹'이라고하는 사용자에게 표시하는 것과 다른 사용자를 속이거나 검색 엔진에 다른 콘텐츠를 표시하지 마십시오"라고 명시되어 있습니다.-검색 엔진 로봇을 필터링하는 mod_rewrite 지시문을 작성하지 마십시오.

(1) 내용 : 검색 엔진 로봇이 일을 선호하는 URI 매핑 (이 콘텐츠에 대한 링크 순위를 매기는 기준이됩니다) - 임시 리디렉션을 만들 mod_rewrite를를 사용하거나 여러 URI의에서 동일한 콘텐츠를 제공하는 경우에는 지정을 고려 정식 URI를 내 HTML 문서.

mod_rewrite가 작업에 적합한 도구처럼 보이지만 그렇지 않은 일반적인 상황이 있습니까?

이는 사례별로 사용을 해결하고 제안 된 해결 방법이 자신의 요구에 적합한 지 여부를 판단 할 수 있도록하는 IMHO (독자 권)에있는 거대하고 잠재적으로 논쟁이되는 주제입니다.

몇 가지 일반적인 예는 무엇입니까?

AskApache의 mod_rewrite 트릭과 팁 은 정기적으로 나타나는 모든 일반적인 사용 사례에 대해 다루지 만 주어진 사용자에 대한 "올바른"솔루션은 사용자 구성의 정교함과 기존 지시문에 따라 달라질 수 있습니다 (일반적으로 mod_rewrite 질문이 올 때마다 사용자가 어떤 다른 지시문 을 가지고 있는지 확인하는 것이 좋습니다 .


AskApache 링크에 감사드립니다. 내가 찾던 것입니다!
sica07

AskApache 광대는 공식적으로 ASF에 의해 지원되지 않습니다. 그가 말한 것의 대부분은 논쟁의 여지가 있거나 명백한 잘못입니다.
adaptor

@adaptr 분명히 알고있는 우수한 자료를 공유하십시오.
danlefree

"mod_rewrite가 작업에 적합한 도구 인 것처럼 보이지만 그렇지 않은 일반적인 상황" - 간단한 mod_rewrite를 이미 사용하고 있지 리디렉션. mod_alias가 사용 Redirect또는 RedirectMatch대신합니다. 또한 아파치 문서를 참고하십시오 : mod_rewrite를 사용하지 않을 때
MrWhite

21

많은 관리자 / 개발자와 마찬가지로 수년간 재 작성 규칙의 복잡한 문제와 싸우고 기존 Apache 문서에 만족하지 못했기 때문에 개인 프로젝트로 mod_rewrite실제로 Apache의 나머지 부분과 실제로 작동하고 상호 작용 하는 방식에 대한 결론을 얻었습니다. 지난 몇 개월 동안 strace소스 코드를 + 테스트하여 테스트 사례를 계측 하여이 모든 것을 처리했습니다.

다시 작성 규칙 개발자가 고려해야 할 몇 가지 주요 의견은 다음과 같습니다.

  • 재 작성의 일부 측면은 서버 설정, 가상 호스트, directory, .htaccess 처리에 공통 그러나
  • PerDir ( .htaccess) 처리 와 달리 일부 처리는 루트 구성 (서버 구성, 가상 호스트 및 디렉토리)에서 매우 다릅니다 .
  • 더 나쁜 것은 PerDir 프로세싱이 거의 무차별 적으로 내부 리디렉션 사이클을 트리거 할 수 있기 때문에 루트 구성 요소는 이러한 PerDir 프로세싱이이를 트리거 할 수 있음을 인식해야합니다.

이 때문에 rewrite 사용자 커뮤니티를 두 가지 범주로 나누고 완전히 별개로 취급해야한다고 말할 수 있습니다.

  • 아파치 설정에 루트 액세스 권한이있는 사람 . 이들은 일반적으로 응용 프로그램 전용 서버 / VM을 사용하는 관리자 / 개발자이며 여기의 메시지는 매우 간단 .htaccess합니다. 가능하면 파일을 사용하지 마십시오 . 서버 또는 vhost 구성에서 모든 작업을 수행하십시오. 개발자는 디버깅을 설정하고 rewrite.log 파일에 액세스 할 수 있으므로 디버깅이 매우 쉽습니다.

  • 공유 호스팅 서비스 (SHS)의 사용자 .

    • 이러한 사용자 사용 .htaccess가능한 대안이 없으므로 / Perdir 처리 를 사용해야 합니다.
    • 더 나쁜 것은, 그러한 사용자의 기술 수준 (mod_rewrite의 정규식 기반 래더-로직을 사용하는 한)은 일반적으로 숙련 된 관리자보다 현저히 낮습니다.
    • Apache와 호스팅 제공 업체는 디버깅 / 진단 지원을 제공하지 않습니다. 유일한 진단 정보는 성공적인 리디렉션, 잘못된 URI 로의 리디렉션입니다. 또는 404/500 상태 코드. 이것은 혼란스럽고 무력하게 만듭니다.
    • Apache는이 사용 사례에서 재 작성이 어떻게 작동하는지 설명하는 데 약합니다. 예를 들어, PerDir .htaccess파일이 선택된 이유와 이유에 대한 명확한 설명을 제공하지 않습니다 . PerDir 사이클링의 복잡성과이를 피하는 방법은 설명하지 않습니다.

세 번째 커뮤니티가있을 수 있습니다. SHS 제공 업체의 관리 및 지원 직원은 두 캠프 모두에서 어려움을 겪고 위와 같은 결과를 겪어야합니다.

필자는 이 게시물을 짧게 유지하기 위해 여기에서 반복하지 않을 많은 세부 사항을 다루는 기사 스타일 블로그 게시물 (예 : .htaccess 파일에서 다시 쓰기 규칙 사용에 대한 추가 정보)을 작성했습니다 . 전용 공유 및 VM FLOSS 프로젝트를 지원할뿐 아니라 자체 공유 서비스가 있습니다. SHS 계정의 테스트 도구로 표준 LAMP VM을 사용하기 시작했지만 결국에는 적절한 미러 VM을 수행하는 것이 좋습니다 ( 여기에 설명되어 있음 ).

그러나 관리자 커뮤니티가 .htaccess사용자 를 어떻게 지원해야하는지에 대해서는 다음 을 개발하고 제공해야한다고 생각합니다.

  • 재 작성 시스템이 실제로 PerDir 처리에서 작동하는 방식에 대한 일관된 설명
  • .htaccess다시 쓰기 규칙 을 작성하는 방법에 대한 일련의 지침 / 모범 사례
  • W3C html 파서와 유사한 간단한 웹 기반 재 작성 스크립트 파서 유형이지만 사용자는이를 통해 테스트 URI 또는 ​​동일한 테스트 벡터를 입력하고 재 작성 논리 흐름에 대한 즉각적인 로그를 얻을 수 있습니다.
  • 규칙에서 내장 진단을 얻는 방법에 대한 힌트 (예 :

    • 사용 [E=VAR:EXPR]사실을 악용 EXPR대상 스크립트 진단으로이를 사용할 수 역 참조 ($ N 또는 % N)를 확장됩니다.
    • 내부 재 지정을 이용할 필요 없이 전체 재 작성 체계가 작동하도록 [OR], [C], [SKIP] 및 [L] 플래그를 사용하여 재 작성 규칙을 주제별로 주문한 경우 다음을 방지하기 위해 다음을 규칙 1로 추가 할 수 있습니다. 모든 반복 번거 로움 :

      RewriteCond %{ENV:REDIRECT_STATUS} !=""
      RewriteRule .  -  [L]
      

이것은 잘 문서화되어 있습니다. 문서가 이것을 설명하지 않는 이유는 무엇입니까?
adaptor

2
당신이해야 할 모든 .htaccess주제 를 구독하고 볼 수 있습니다. 대부분의 초보자는 절망적으로 혼란스러워합니다. 이들 중 대부분은 LAMP 서비스에 대한 첫 경험과 공유 서비스에 대한 mod_rewrite를 가지고 있으므로 시스템 / 호스트 구성에 대한 루트 액세스 권한이 없으므로 .htaccess파일을 통해 디렉토리 당 처리해야 합니다. 초보자가 "피할 수있는"중요한 차이점이 있습니다. 나는 나 자신을 파워 유저로 생각하고 여전히 미묘한 것을 발견하고있다. 내가 말했듯이 strace와 소스 코드 스캐닝을 사용하여 몇 가지 측면을 해결해야했습니다. 필요하지 않았습니다. :-(
TerryE

전적으로 동의합니다. "재 작성 사용자 커뮤니티를 두 가지 범주로 나누고 완전히 분리 된 것으로 취급해야합니다." 일부 사용자는 공유 호스팅 을 사용하고 있기 때문에 전문가에게조차 매우 취약하고 복잡하며 혼란스러워 하는에 의존 해야 합니다 .htaccess. 아직 문제가 있습니다.
Ryan

15

재 작성 맵 사용

다시 쓰기 맵으로 할 수있는 일이 많이 있습니다. Rewritemaps는 Rewritemap 지시문을 사용하여 선언 된 다음 RewritCond 평가 및 RewriteRule Subsitutions에서 모두 사용할 수 있습니다.

RewriteMap의 일반적인 구문은 다음과 같습니다.

RewriteMap MapName MapType:MapSource

예를 들면 다음과 같습니다.

RewriteMap examplemap txt:/path/to/file/map.txt

그런 다음 다음과 같은 구문에 mapname을 사용할 수 있습니다.

${examplemap:key}

지도에는 키 / 값 쌍이 포함되어 있습니다. 키를 찾으면 값이 대체됩니다. 단순 맵은 단순한 텍스트 파일이지만 해시 맵과 SQL 쿼리를 사용할 수 있습니다. 자세한 내용은 문서에 있습니다.

http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritemap

이스케이프 문자열.

일부 조작을 수행하는 데 사용할 수있는 네 개의 내부 맵이 있습니다. 특히 이스케이프 처리되지 않은 문자열이 유용 할 수 있습니다.

예를 들어 : 쿼리 문자열에서 "café"문자열을 테스트하려고합니다. 그러나 브라우저는 이것을 서버로 보내기 전에 이스케이프 처리하므로 일치시키고 싶은 모든 문자열에 대해 URL 이스케이프 버전이 무엇인지 알아 내야합니다.

RewriteMap unescape int:unescape

RewriteCond %{QUERY_STRING}  (location|place)=(.*)
RewriteCond ${unescape:%2}   café
RewriteRule ^/find/$         /find/1234? [L,R]

하나의 RewriteCond를 사용하여 쿼리 문자열 매개 변수의 인수를 캡처 한 다음 두 번째 rewriteCond의 맵을 사용하여 이스케이프를 해제하는 방법에 유의하십시오. 그런 다음 비교됩니다. 또한 % 1에 "location"또는 "place"가 포함되어 있기 때문에 다시 쓰기 맵에서 키로 % 2를 어떻게 사용해야하는지 참고하십시오. 괄호를 사용하여 패턴을 그룹화 할 때 패턴도 캡처되므로 캡처 결과를 사용할지 여부는 ...


마지막 문장은 사실이 아닙니다. mod_rewrite정규 표현식 엔진과 같은 비 캡처 그룹을 지원 (?:location|place)하고 이것은 단지 예를 하나 캡처를해야합니다.
TerryE

12

다시 쓰기 규칙을 작성할 때 가장 흔히 발생하는 실수는 무엇입니까?

가장 쉬운 함정은 from에서 /base/1234/index.html와 같이 명백한 경로를 변경하는 URL을 다시 작성할 때 /base/script.php?id=1234입니다. 스크립트 위치에 대한 상대 경로가있는 이미지 또는 CSS는 클라이언트에서 찾을 수 없습니다. 이 문제를 해결하기위한 많은 옵션 이이 FAQ 에서 찾을 수 있습니다 .


1
링크 주셔서 감사합니다. 특히 재 작성에 익숙하지 않은 다른 팀 구성원과 작업 할 때 <base>가장 쉽게 따라하면서 상대 경로를 사용할 수 있도록 태그를 추가 합니다.
kontur
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.