2013-03-16 1 views
0

내 하위 도메인의 방문객에게 특정 하위 도메인 링크 형식을 사용할 때만 허용하려고합니다. 나는 이것이 SE를 차단할 것임을 알고 있지만 어쨌든 서브 도메인을 색인화하지 않기를 바란다.htaccess in subbdomain 리디렉션 규칙 건너 뛰기

subdomain.maindomain.com/aaa/bbb/ccc

을이로 다시 작성해야합니다 :

허용되는 링크는 다음과 같이한다

하위 도메인을. maindomain.com/index.php?a=aaa & b = bbb & c = ccc

이 양식의 아니에요 및 빈 또는 외부 참조 페이지에서 오는 어떤

모든게은 변수 주요 도메인 및없이 이동한다

maindomain.com/ 내가 구성의 모든 종류의 시도

, 내 마지막을 그것은 또한 리디렉션 주 도메인에 허용 된 형식의 하위 도메인에 대한 요청과도에 요청으로 바르를 추가,

RewriteEngine on 
RewriteRule ^/?(\w{3})/(\w{3})/(\w{3})$ index.php?a=$1&b=$2&c=$3 [S=1,L] 

RewriteCond %{HTTP_REFERER} !^http://(www\.)?maindomain\.com [NC] 
RewriteRule ^(.*)$ http://domain\.com/ [L] 

을하지만 여전히 내가 원하는 일을 아니에요 : 하위 도메인 폴더에 htaccess로 파일은 다음과 같습니다 메인 도메인,이 페이지로 이동

maindomain.com/?a=aaa & B = BBB & C = 혼

당신은 위에서 정의 된 상태로 날 수 있습니다.

성능에 관한 두 번째 질문 : 분명히 PHP를 사용하여이 확인/리디렉션을 수행 할 수 있지만 귀하의 의견에보다 효율적인 것은 무엇입니까?

감사합니다. 내가 제대로 당신의 논리를 이해하면

답변

1

이 시도하십시오

RewriteEngine on 
RewriteBase/

# Don't do any more rewrites if on index.php 
# Note that you can add the HTTP_HOST condition here if you only want it to be active for the subdomain 
RewriteRule ^index\.php$ - [L] 

# If on subdomain then check that the referer is from main domain and attempt to match a regex 
# If we find a match then ignore the next rule that rewrites subdomain to domain.com 
# Basically this is like an awkward if-else statement.. 
# ================  

RewriteCond %{HTTP_HOST} ^subdomain\.domain\.com$ 
RewriteCond %{HTTP_REFERER} ^http://(www\.)?domain\.com [NC] 
# Rewrites /aaa/bbb/ccc to /index.php?a=aaa&b=bbb&c=ccc 
RewriteRule ^(\w{3})/(\w{3})/(\w{3})$ index.php?a=$1&b=$2&c=$3 [S=1,L] 

# Redirect all requests from subdomain to domain.com by default 
# ================ 

RewriteCond %{HTTP_HOST} ^subdomain\.domain\.com$ 
# Add the trailing question mark to delete all query parameters 
RewriteRule .* http://domain.com/? [L] 
+0

감사합니다.하지만 그래도 작동하지 않습니다. http://subdomain.domain.com/aaa/bbb/cee에 대한 직접 액세스는 여전히 http://domain.com/ – user2176640

+0

으로 리디렉션됩니다. 작동하지 않는 기능은 무엇입니까? subdomain.domain.com에서 domain.com으로 다시 작성합니까? 코드를 몇 번 업데이트했습니다. – kjetilh

+0

@ user2176640 업데이트 된 답변을 참조하십시오. '[L]'플래그가 항상 모든 추가 재 작성 처리를 멈추는 것처럼 보이는 것은 아니기 때문에'RewriteRule^index \ .php $ - [L]'지시자를 맨 위에 추가해야합니다. – kjetilh

0

당신은 아주 가까이있어. 몇 가지 추가 부품이 필요합니다.

  • 플래그 S=1은 피해가 없지만 반드시 필요한 것은 아닙니다.
  • referer 조건을 첫 번째 규칙으로 이동하고 반전시킵니다. 하위 도메인도 허용 할 수 있습니다.
  • index.php이 기본 도메인으로 리디렉션되지 않도록 제외 조건을 추가로 추가하십시오.
  • 두 번째 규칙에서 대체에 원래 요청을 사용하지 않으므로이를 캡처 할 필요가 없습니다.
  • 인수가 주 도메인으로 전달되는 것을 방지하려면 물음표 ?을 추가하십시오.
  • R 플래그를 추가하십시오. 클라이언트를 리디렉션하고 요청을 다시 작성하지 않으려면 플래그를 추가하십시오.심지어 일부 PHP 스크립트를 명중하기 전에 다시 작성하거나 htaccess로로 리디렉션 경우 함께

    RewriteEngine on 
    
    RewriteCond %{HTTP_REFERER} ^http://(.+\.)?maindomain\.com [NC] 
    RewriteRule ^(\w{3})/(\w{3})/(\w{3})$ index.php?a=$1&b=$2&c=$3 [L] 
    
    RewriteCond %{REQUEST_URI} !$index\.php$ 
    RewriteRule^http://domain\.com/? [R,L] 
    

    , 성능에 대해서는

모든 부품은 작업이 이루어집니다. 그래서, 나는 이것을 .htaccess로하는 것이 낫다고 생각합니다.

+0

감사합니다. subdomain.maindomain.com/aaa/bbb/ccc 형식의 리퍼러가없는 URL은 여전히 ​​maindomain.com으로 리디렉션됩니다. 다른 구성 오류가있을 수 있다고 생각하기 시작했습니다. 아마 가상 호스트에 아파치가 있습니까? 어떤 이상? – user2176640

+0

@ user2176640 나는 이것이 당신이 원하는 것이라고 생각했습니다. 당신은 "이 형식이 아닌 것을 무한대로 썼고 빈 또는 외부 참조 자로부터 오는 것은 변수가없는 메인 도메인으로 이동해야합니다" –