2009-08-30 2 views
0

AliasMatch를 사용하여 두 개 이상의 특정 정규식 패턴에 대해 을 제외한을 제외한 폴더 내의 모든 항목에 대한 별칭을 만들고 싶습니다.mod_alias AliasMatch Regex - 두 패턴을 제외한 폴더의 모든 항목을 일치합니까?

AliasMatch /content(.*) /home/username/public_html/$1 

하지만 위의 별칭이 일치하지 않는 두 개의 정규식 패턴이 예를 들어,이 있습니다 : 다음 AliasMatch는 '내용'폴더에있는 모든 별칭을 만듭니다 예를 들어

^content/([a-zA-Z0-9_-]+)/id-([a-zA-Z0-9_-]+)/([0-9]+) 
^content/([a-zA-Z0-9_-]+)/nn-([a-zA-Z0-9_-]+) 

패턴을 무효화하는 데 NOT (!) 문자를 사용할 수 있지만이 패턴을 사용하는 방법이나 AliasMatch에서 여러 패턴을 무효화하는 방법을 알지 못합니다.

어떻게이 작업을 수행 할 수 있습니까?

답변

1

당신이 말하는 것은 부정적 선견문입니다. 일치시키지 않으려는 대상은 (?!foo)과 같은 정규식으로 둘러 쌀 수 있습니다. 정규 표현식을 결합하는 것은 그 (것)들 사이의 파이프와 함께 스트링처럼 간단 할 수 있지만,이 경우보다 조금 더 잘할 수 있습니다.

[a-zA-Z0-9_-]+/(?:id-[a-zA-Z0-9_-]+/[0-9]+|nn-[a-zA-Z0-9_-]+) 

파이프 (또는 '|', 교대 연산자) 무엇보다 낮은 우선 순위를 가지고 있기 때문에, 교번이 그룹에 포함되어야한다 :이 정규 표현식은 동일한 두 개의 정규 표현식에의 첫 번째 부분을 재사용한다. 비 캡처 그룹 (예 : (?:...))을 사용하고 정규식에서 괄호를 제거했습니다. 그렇지 않으면, 그들은 으로 캡처하려는 그룹의 번호 매기기에서 벗어났습니다. 그리고 규칙의 두 번째 부분에서 $1 이외의 것을 사용해야했습니다. 여기에 전체 정규식입니다 :

^/content(?![a-zA-Z0-9_-]+/(?:id-[a-zA-Z0-9_-]+/[0-9]+|nn-[a-zA-Z0-9_-]+))(.*) 

편집 : 분명히, AliasMatch에서 사용하는 정규식 맛이 lookaheads을 지원하지만, 자신의 부정 구문은하지 않습니다 !(^/foo)합니다. 그 목적은 전체 정규식을 부정하는 것으로 보이는데, 이는 당신을 도울 수 없다는 것을 의미하지만 어쩌면 그것을 필요로하지 않을 수도 있습니다. 어쩌면 그 디렉토리들을 그들 자신에게 별명을 붙일 수 있습니다. 그러면 아무 것도 무효화하지 않아도됩니다.

AliasMatch ^(/content/[a-zA-Z0-9_-]+/id-[a-zA-Z0-9_-]+/[0-9]+.*) $1 
AliasMatch ^(/content/[a-zA-Z0-9_-]+/nn-[a-zA-Z0-9_-]+.*) $1 
AliasMatch ^/content/(.*) /home/username/public_html/$1 

아니면 당신이 <DirectoryMatch> 지시문 뭔가를 할 수 있으며, mod_rewrite에로 전환. 하지만 (분명히) 아파치 전문가가 아니에요. 제 전문은 정규 표현식이고 정규 표현식이 문제를 해결할 것이라고 생각하지 않습니다.

+0

고맙습니다. :)하지만, httpd.conf ("AliasMatch [정규식]/home/username/public_html/$ 1")에 복사 한 내용을 복사 한 후에는 httpd가 더 이상 컴파일되지 않습니다. 컴파일 할 수 없었다. " 구문 오류. 여기서 문제는 무엇입니까? 나는 그것을 잘못 사용하고 있는가? – Tristan

+0

문제는 lookahead와 관련이있는 것 같습니다. httpd.conf는 구문 분석 할 수없는 것 같습니다. – Tristan

+0

네 말이 맞아. 제 편집을 봐. –

3

ModAlias는 실제로 부정적인 선견자를 지원합니다. 나는 아주 잘 작동 내 사이트에이를 사용하고 있습니다 :

AliasMatch ^/(?!w/|BingSiteAuth\.xml$|favicon\.ico$|google.{16}\.html$|robots\.txt$) /path/to/file 

당신의 정규식은 "/"로 시작하도록해야합니다, 항상 mod_alias가 가진 첫번째 문자로! 미리보기를 사용하여 규칙을 시작하지 마십시오. 그렇지 않으면 구문 분석이 실패합니다.

관련 문제