2013-10-25 4 views
0

sitecore multisite 설정이 있습니다.Sitecore를 통해 부모 노드에 액세스 할 수 있습니다.

나는 현재 "중복 콘텐츠 증후군"에 시달리고 있는데, Google 봇은 내 사이트를 색인하여 반대 사이트의 콘텐츠에 액세스 할 수 있습니다.

이것은 Google 검색에서 사이트에 낮은 등급을 부여하는 2 개의 다른 hostNames에서 동일한 콘텐츠를 찾습니다.

중복 된 내용을 발견 한 이유는 URL에 이름을 입력하여 현재 탐색중인 사이트 노드보다 하위 사이트 노드에 액세스 할 수 있기 때문입니다.

이 사이트의 내 Web.config의 설정입니다 :

< 사이트 이름 = "WEBSITE2"여기서 hostName = "local.domain.dk"virtualFolder = "/"> physicalFolder = "/"ROOTPATH ​​= "/" "sitecore/content/talk"startItem = "/"데이터베이스 = "웹"도메인 = "엑스트라 넷"allowDebug = "true"cacheHtml = "true"htmlCacheSize = "10MB"registryCacheSize = "0"viewStateCacheSize = "0"xslCacheSize = "5메가바이트"filteredItemsCacheSize = "2메가바이트"enablePreview = "true"를 enableWebEdit = "true"를 enableDebugger = "true"를 disableClientData = "거짓"/>

< 사이트 이름 = "웹 사이트"virtualFolder = "/"physicalFolder = "/ "> rootPath ="/ si "true"cacheHtml = "true"htmlCacheSize = "10MB"registryCacheSize = "0"viewStateCacheSize = "0"xslCacheSize = "5MB/tecore/content/home"startItem = "/"데이터베이스 = "웹"도메인 = "엑스트라 넷" "filteredItemsCacheSize ="2메가바이트 "enablePreview ="true "를 enableWebEdit ="true "를 enableDebugger ="true "를 disableClientData는 ="false "를 나는 각 사이트의 루트에 ROOTPATH을 설정하더라도 />

, 난 여전히입니다 local.domain-talk/integration을 입력하여 local.domain.dk/ydelser/integration의 하위 노드에 액세스 할 수 있습니다.

도움이 될 것입니다.

답변

1

<site> 구성에 hostNametargetHostName 속성을 설정해야합니다. 이렇게하면 링크가 호스트 이름을 포함한 전체 URL을 렌더링하는 사이트간에 콘텐츠를 연결할 때 보장됩니다.

hostName: The host name of the incoming url. May include wildcards (ex. www.site.net, *.site.net, *.net, pda.*, print.*.net) 
      It's possible to set more than one mask by using '|' symbol as a separator (ex. pda.*|print.*.net) 
targetHostName: The host name to use when generating URLs to items within this site from the context of another site. 
      If the targetHostName attribute is absent, Sitecore uses the value of the hostName attribute instead. 
      Used only when the value of the Rendering.SiteResolving setting is true. 

그리고 만들 Rendering.SiteResolving=true

<!-- SITE RESOLVING 
     While rendering item links, some items may belong to different site. Setting this to true 
     make LinkManager try to resolve target site in order to use the right host name. 
     Default value: true 
    --> 
    <setting name="Rendering.SiteResolving" value="true" /> 

당신은 항상 옌스는 표준 링크 태그에 추가 말합니다 있도록, 전체 경로가있는 페이지에 액세스 할 수 있는지 확인하십시오. 일단 크로스 사이트 링크 및 정식 링크 문제를 해결하면 Google 로봇은 깨끗한 링크를 따라야합니다.

0

"웹 사이트"노드의 구성에서 호스트 이름 속성을 놓친 것 같습니다. 2 개의 웹 사이트가있는 경우 해당 웹 호스트 노드에 해당 호스트 이름이 필요합니다.

파이프 라인에 사용자 지정 항목 해결 프로그램을 사용하지 않습니까? 이로 인해 문제가 발생할 수 있습니다.

0

Sitecore에는 다중 사이트 링크 생성과 관련된 여러 가지 문제가 있으며, 그 중 일부는 최신 릴리스 6.6 : http://sdn.sitecore.net/Products/Sitecore%20V5/Sitecore%20CMS%206/ReleaseNotes/ChangeLog/Release%20History%20SC66.aspx#660update6에서 해결되었습니다 (링크 공급자 변경 사항 섹션 참조).

이와 같은 교차 사이트 노이즈에 대해 몇 가지 추가 안전 조치를 추가하는 것도 비교적 간단합니다. 당신은 이런 식으로 뭔가 함께 httpRequestBegin 파이프 라인에 ItemResolver 후 단계를 추가 할 수 있습니다 (죄송합니다, 비트가 compileable 예를 작성하는 시간을 누르면,이 비록 아이디어를 줄 것이다) :

Item siteRoot = Sitecore.Context.Site.StartItem; 
if (!(Sitecore.Context.Item.ID == siteRoot.ID || Sitecore.Context.Item.Axes.IsDescendantOf(siteRoot)) 
    // break and do 404 
0

방법이 Sitecore 해결되는 항목을 사용하면 여러 사이트 및 여러 도메인의 페이지에 액세스 할 수 있습니다.

당신은 다음과 같은 구조가있는 경우 :

-sitecore
--content --- 사이트 개발
---- site1page1
--- 사이트 2
---- site2page1

site1은 site1.com 도메인을 가지고 site2는 site2.com을 갖습니다. 전체 경로로 항목을 지정할 수 있습니다. 그래서 예를 들어이 같은 사이트 1에서 사이트 2의 페이지에 액세스 할 수 있습니다

site1.com/sitecore/content/site2/site2page1.aspx

이 SEO에 관해서이 처리의 여러 가지가 있지만 가장 간단한이다 메타 데이터에서 정식 링크를 사용하므로 Google은 이것을 중복 콘텐츠로 간주하지 않습니다. 그런 다음 논리를 추가하여 모든 페이지에서 원하는 URL로 메타 태그를 렌더링 할 수 있습니다.

한 사이트의 페이지를 다른 사이트에 표시하지 않으려면 각 사이트마다 다른 도메인을 만든 다음 Sitecore 보안을 사용하여 한 사이트에서 다른 사이트로의 읽기 액세스를 금지해야합니다. 예를 들어 site1을 도메인으로 만든 다음 해당 도메인의 site2 항목에 대한 읽기 액세스를 제한 할 수 있습니다.

0

표준 ItemResolver가 URL을 너무 용서한다는 것에 동의합니다. 어느 사이트에서나 동일한 페이지를 얻을 수있을뿐만 아니라 전체 Sitecore 경로 (예 :/sitecore/content/Site/page)를 사용하여 중복 된 페이지를 얻을 수도 있습니다. 이 프로젝트가 클라이언트에게 큰 문제가되었던 한 프로젝트에서 좀 더 엄격한 사용자 지정 ItemResolver를 만들었습니다. 여기있다 : 당신이 디 컴파일 표준 ItemResolver이를 비교하면, 당신이 첫 번째 단계에 사용 된 것과 같은 코드라고 볼 수

public class ItemResolver : Sitecore.Pipelines.HttpRequest.ItemResolver 
{ 
    public override void Process(HttpRequestArgs args) 
    { 
     Assert.ArgumentNotNull(args, "args"); 
     if (((Context.Item == null) && (Context.Database != null)) && (args.Url.ItemPath.Length != 0)) 
     { 
      if (Context.Domain.Name.ToLower() == "sitecore") 
      { 
       base.Process(args); 
       return; 
      } 

      Profiler.StartOperation("Resolve current item."); 
      string path = MainUtil.DecodeName(args.Url.ItemPath); 
      Item item = args.GetItem(path); 
      if (item != null) 
      { 
       Tracer.Info("Current item is \"" + path + "\"."); 
      } 
      Context.Item = item; 
      Profiler.EndOperation(); 
     } 
    } 
} 

. 첫 번째 단계가 실패하면 다른 수단을 사용하여 항목을 찾지 않습니다. 이것의 또 다른 장점은 표준 ItemResolver보다 조금 더 빠르게 실행된다는 것입니다.