mod_alias aliasmatch regex- 두 패턴을 제외한 폴더의 모든 것을 일치시겠습니까?
문제
aliasmatch를 사용하여 폴더 내의 모든 것에 대한 별명을 만들고 싶습니다. 제외하고 두 가지 (또는 그 이상의) 특정 Regex 패턴의 경우.
예를 들어 다음 aliasmatch는 'Content'폴더의 모든 것에 대한 별칭을 만듭니다.
AliasMatch /content(.*) /home/username/public_html/$1
그러나 위의 별칭이 일치하고 싶지 않은 두 가지 Regex 패턴이 있습니다.
^content/([a-zA-Z0-9_-]+)/id-([a-zA-Z0-9_-]+)/([0-9]+)
^content/([a-zA-Z0-9_-]+)/nn-([a-zA-Z0-9_-]+)
((!) 문자는 패턴을 무효화하는 데 사용될 수 있지만 여기서 사용하는 방법이나 별명에서 여러 패턴을 부정하는 방법을 모르겠습니다.
어떻게 이렇게 할 수 있습니까?
해결책
당신이 말하는 것은 불려집니다 부정적인 전망, 그리고 당신은 다음과 같이 일치시키고 싶지 않은 것을 위해 Regex 주위에 그것을 감싸고 있습니다. (?!foo)
. Regexes를 결합하는 것은 그들 사이의 파이프와 함께 끈으로 간단 할 수 있지만이 경우 그보다 조금 더 잘할 수 있습니다. 이 REGEX는 동일합니다.
[a-zA-Z0-9_-]+/(?:id-[a-zA-Z0-9_-]+/[0-9]+|nn-[a-zA-Z0-9_-]+)
파이프 (또는 '|'
, 교대 연산자)는 다른 무엇보다 우선 순위가 낮으며, 교대는 그룹에 포함되어야합니다. 내가 사용했음을 주목했다 비과 캡처 그룹 -- 즉, (?:...)
- 그리고 당신의 regexes의 괄호를 제거했습니다. 그렇지 않으면, 그들은 당신이 한 그룹의 번호를 버렸을 것입니다. 하다 캡처하고 싶고 다른 것을 사용해야했을 것입니다. $1
규칙의 두 번째 부분에서. 여기에 전체 regex가 있습니다.
^/content(?![a-zA-Z0-9_-]+/(?:id-[a-zA-Z0-9_-]+/[0-9]+|nn-[a-zA-Z0-9_-]+))(.*)
편집 : 분명히 Aliasmatch에서 사용하는 Regex 맛은 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
아니면 당신은 a로 무언가를 할 수 있습니다 <DirectoryMatch>
지침 또는 mod_rewrite로 전환함으로써. 그러나 나는 (분명히) Apache 전문가가 아닙니다. Specialty는 Regexes이며, Regex가 귀하의 문제를 해결할 것이라고 생각하지 않습니다.
다른 팁
Modalias는 실제로 부정적인 전망대를 지원합니다. 내 사이트에서 이것을 사용하고 있습니다. 매우 잘 작동합니다.
AliasMatch ^/(?!w/|BingSiteAuth\.xml$|favicon\.ico$|google.{16}\.html$|robots\.txt$) /path/to/file
항상 mod_alias의 첫 번째 캐릭터이므로 Regex를 "/"로 시작하십시오! 전망대로 규칙을 시작하지 마십시오. 그렇지 않으면 구문 분석이 실패합니다.