2012-07-18 2 views
1

설명없이 제 질문을 읽으려면 아래의 큰 굵은 머리글로 건너 뜁니다.HTTP_HOST의 모든 부분과 일치하는 htaccess regex

여러분, 여기 있습니다. 첫째, 코드는 내가 가진 : 원하는대로 그대로

AddType text/x-server-parsed-html .html .htm 

RewriteEngine On 
RewriteBase/

# checking to see if it's a secure request, then set environment var "secure" to either  "s" or "" 
# 
RewriteCond %{SERVER_PORT}s ^(443(s)|[0-9]+s)$ [NC] 
RewriteRule ^(.+)$ - [env=secure:%2] [NC] 



# Gets the value of the subdomain and puts it into environment variable "sub" 
# 
RewriteCond %{HTTP_HOST} ^([^\.]*)(\.)?example.com [NC] 
RewriteRule ^(.*)$ - [env=sub:%1] [NC] 



# Determines if the sub domain is blank, w, or ww, then redirects w/301 to www... 
# 
RewriteCond %{ENV:sub} ^(w|ww|)$ 
RewriteRule ^(.*)$ http%{ENV:secure}://www.example.com/$1 [R=301,L] 



# Gets the highest sub domain and adds it as a top subdirectory to each request 
# 
RewriteCond %{REQUEST_URI}:example/%{ENV:sub} !^/([^/]+)[^:]*:\1 [NC] 
RewriteRule ^(.*)$ /example/%{ENV:sub}/$1 [L] 


#ErrorDocument 404 /pagenotfound 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php?url=$1&%{QUERY_STRING} [PT] 

그래서, 모든 것을 내가 명시 적으로 도메인을 설정해야합니다 제외하고, 나는 그것이 작동합니다, 그래서 그것을 얻기 위해 정규식을 알아낼 수 없습니다 정확히 작동 다른 도메인과 동일합니다. 다음은 작동 방식입니다.

먼저 요청이 안전한지 확인한 다음 나중에 저장합니다.

다음으로 www.example.com에 대한 하위 도메인으로 "w", "ww"또는 ""가있는 example.com에 대한 요청에 대해 301 리디렉션을 수행하므로 사이트에 대한 모든 요청이 강제로 사용됩니다 www.example.com, "test"또는 "dev"또는 설정 한 것과 같은 (w | ww | www) 이외의 하위 도메인을 지정하지 않는 한

다음으로, "dev.example.com"과 같은 것을 요청했거나 "www.example.com"으로 리디렉션 되었기 때문에 항상 존재할 하위 도메인의 값을 가져옵니다. 두 단계 아래로 하위 디렉토리로 요청을 다시 작성합니다 (리디렉션하지 않음). 이것이 설정되면 루트 디렉토리의 "example"아래 "www"디렉토리가됩니다.

마지막으로 URI를 다시 작성 (리디렉션하지 않음)하여 문제가 없으므로 내가 좋아하는 방식으로 작동합니다.

디렉토리 구조는 다음과 같습니다. 루트에 여기에 호스팅 된 모든 사이트의 디렉토리가 있습니다 (예 : 다른 사이트, 세 번째 사이트). 그것들은이 htaccess 파일의 목적에 완전히 무관합니다. 각 디렉토리에는 최소한 두 개의 디렉토리 "www"와 "dev"가 있습니다. 제작 사이트 파일은 "www"이고 개발 파일은 "dev"입니다. 여기에 테스트 환경을위한 "테스트"라는 디렉토리가있을 수 있습니다. 또는 원하는 모든 것, 이것이 내가 설정하는 방법입니다. 나는이 두 가지가 제대로 작동하는지 라인을 알고

Rewritecond %{HTTP_HOST} ^(match sub domain).(match domain).(match TLD) [NC] 
RewriteRule ^(.*)$ -[env=sub:%1,env=domain:%2,env=tld:%3] [NC] 

, 그것이 내가 알아낼 수 없습니다 라인을 하나의 단지 정규식입니다 :

그럼, 내가 원하는 식으로 뭔가입니다. 하위 도메인이 지정되어있을 수도 있고 없을 수도 있으며 도메인보다 앞에있는 기간이있을 수도 있고 그렇지 않을 수도 있습니다. 같은

RewriteRule ^(.*)$ http%{ENV:secure}://www.%{ENV:domain}.%{ENV:tld}/$1 [R=301,L] 

그리고 29 행 :

RewriteCond %{REQUEST_URI}:%{ENV:domain}/%{ENV:sub} !^/([^/]+)[^:]*:\1 [NC] 
나 라인을 추천을 다시 할 수 있도록하여 설명

이 전체 스크립트는 루트 디렉토리에서 호스팅 사이트 중 하나를 처리 할 것

그래서, 나는 내가 무엇을 가지고 있는지, 무엇을하려고하는지, 그리고 내가 성취하고자하는 것을 아주 분명하게 설명했다고 생각합니다. 누구든지 라인 15 정규식 도와 줄 수 있습니까?

답변

0

나는이 두 가지가 제대로 작동하는지 줄을 알고, 내가 알아낼 수 없습니다 라인을 하나의 단지 정규식입니다. 하위 도메인이 지정되어있을 수도 있고 없을 수도 있으며 도메인보다 앞에있는 기간이있을 수도 있고 그렇지 않을 수도 있습니다.

귀하의 정규식은 다음과 같이 보일 것입니다 :

Rewritecond %{HTTP_HOST} ^(([^\.]+)\.)?([^\.]+)\.([^\.]+)$ [NC] 
RewriteRule ^(.*)$ - [env=sub:%2,env=domain:%3,env=tld:%4] 
뿐만 아니라 (당신이 뒤에 공백이 누락되었다 "-")를 규칙 줄을 변경합니다

%1 이제 점을 역 참조하기 때문에, 게다가.

+0

물론! 나는 그것이 경기에서의 기간을 포함시키는 것과 같이 단순해야만한다는 것을 알았다. Jon, 당신은 정규 표현식 마법사입니다! 정말 고마워! 아, 그리고 "-"다음에 누락 된 공백을 보았습니다. 오타가 입력 되었기 때문에 실제 파일에는 맞았지만 언급 해 주셔서 감사합니다! – Patrick

관련 문제