한 언어에 여러 도메인을 설정하는 방법


15

언어를 감지하기 위해 en.example.com과 같은 하위 도메인을 사용하는 Drupal 7 이있는 다국어 사이트가 있습니다. 모든 것이 예상대로 작동하지만 en.m.example.com 등의 도메인에서 액세스 할 수있는 모바일 버전의 웹 사이트 마녀가 있습니다. 어떻게해야합니까? admin/config/regional/language언어 당 하나의 도메인에만 설정할 수 있지만 다음과 같이 작동하려면 두 개를 설정해야합니다.

for English:
en.example.com & en.m.example.com

for German:
de.example.com & de.m.example.com
etc.

Drupal은 언어 선택을 위해 하위 도메인을 사용하여 모든 내부 링크를 절대 경로로 생성한다는 문제가 있습니다. 예를 들어 메뉴 링크는 다음과 같이 생성됩니다.

<li class="menu-773"><a href="http://en.example.com/test" >test</a></li>
and not as
<li class="menu-773"><a href="/test" >test</a></li>

따라서 Apache로 도메인 별칭을 만들어 en.m.example.com에서 en.example.com으로 요청을 보낼 수 있지만 모든 내부 링크는 사용자를 모바일 버전에서 일반으로 되돌릴 수 있습니다. 이 문제를 어떻게 해결할 수 있습니까?


1
이것은 실제로 귀하의 질문에 정확하게 대답하지는 않지만 별도의 모바일 사이트를 보유하지 않는 것이 좋습니다. 모바일 용으로 변경되는 반응 형 레이아웃을 사용하는 것이 좋습니다. 더 나은 환경을 제공하고 유지 관리가 더 쉬우 며 브라우저 검색 및 사이트 전환의 단점을 건너 뜁니다. -디자인 / 테마에 약간의 투자가 필요합니다.
rooby

감사합니다. 이것이 일반적으로 최고라는 것을 알고 있습니다. 그러나 내 웹 사이트의 사용 사례는 모바일 및 일반 사용자와 다릅니다. 전달 될 기능과 내용도 다릅니다. 그래서 나는 그 옵션이 없습니다.
user5950

나는 이것을 이해하지 못한다! 이것은 기본적인 것입니다. 모바일 테마의 하위 도메인과 함께 언어 도메인과 함께 Drupal을 사용할 수 있어야합니다. Drupal과 함께이 일을하는 사람이 없습니까?
user5950

답변:


5

다른 도메인에서 다른 언어를 제공하도록 Drupal을 설정 한 후에는 웹 서버가 여러 도메인에서 동일한 Drupal 사이트로 요청을 보내도록 지시해야합니다.

Apache에서는 .conf (httpd.conf)파일 을 편집 하고 다른 모든 도메인에 별명을 추가 해야 합니다. 예를 들면 다음과 같습니다.

ServerName en.example.com
ServerAlias en.m.example.com

이 외에도 다른 언어의 모든 도메인 이름에 대해 DNS (Domain Name Server)를 서버로 지정해야합니다.


그것은 나를 위해 작동하지 않습니다. 문제는 위에서 설명한 언어 선택에 다른 도메인을 사용하면 모든 내부 링크가 절대 경로로 생성된다는 것입니다. 따라서 en.example.com & en.m.example.com을 사용하여 페이지에 연결할 수 있지만 en.m.example.com 아래의 모든 내부 링크에는 두 번째 하위 우위가 없습니다. 예를 들어 하위 페이지에 대한 링크는 en.example.com/node/1234와 같지만 en.m.example.com/node/1234와 같아야합니다.
user5950

2

답은 : Drupal 7에서는 하나의 언어로 여러 도메인을 사용할 수 없으며, 내가 아는 한 해당 기능을 추가하는 모듈이 없습니다.

그러나 어쨌든 이러한 목표를 달성하기 위해서는 해결 방법이 있습니다. 위에서 언급 한 것처럼 언어 도메인의 문제점은 언어 별 경로 별칭이 있고 Drupal 핵심 함수 url () 로 작성된 모든 내부 경로 가 절대 경로로 작성된다는 것 입니다. 해당 동작을 담당하는 기능 은 다음과 같습니다 .

locale_language_url_rewrite_url(&$path, &$options)
  1. 해당 기본 언어에 대한 언어 도메인을 설정하지 마십시오. 그렇게하지 않으면 Drupal은 xyz.example.com 도메인을 사용하는 경우 기본 언어에 대한 절대 경로를 만들지 않습니다 . 여기서 xyz.example.com이 어떤 언어의 도메인으로 설정되어 있지 않은 경우 Drupal은 모든 URL이 상대적이므로 URL을 클릭하면 하위 도메인이 유지됩니다. 그러나 위에서 설명한대로 언어에 민감한 하위 도메인을 원할 경우이 방법을 사용할 수 없습니다.

    영어 : en.example.com 및 en.m.example.com

    독일어 : de.example.com 및 de.m.example.com 등

  2. 두 번째 방법은 hook_language_init 함수를 사용하여 모든 유형의 현재 언어를 변경하는 입니다. 위의 예제를 작동시키기 위해 다음 코드를 사용합니다.

:

# hook_language_init()
function my_module_language_init() {
  // Current path
  $url = $_SERVER['SERVER_NAME'];

  // Global language object and get languages
  global $language;
  $languages = language_list();

  // Get all subdomains
  $reg = '/^((?:([^\.]+)\.)?(?:([^\.]+)\.))?([^\.]+\.[^\.]+)$/i';
  preg_match($reg, $url, $up);

  # We won't allow all subdomains, only 'm.' and 'm2.'
  # Change this for an other use case.
  if ($up[3] == "m2" || $up[3] == "m") {

    if (!isset($languages[$up[2]])) {
      $langcode = $language->language;
    } else { 
      $langcode = $up[2];
    }
    $new_language         = $languages[$langcode];
    $new_language->domain = $new_language->language . "." . $up[3] .".". $up[4];

    // Set url options
    $options['language'] = $new_language;
    $types = language_types();

    // Set all language types and language domains
    foreach ($types as $type) {
      $GLOBALS[$type] = $new_language;
      $GLOBALS[$type]->domain = $new_language->domain;
    }
  }
}

:이 모듈은 비슷한 않는 생각 drupal.org/project/language_multidomain을 가이 훅을 사용할 수 없습니다 왜 궁금 :하지만 ... api.drupal.org/api/drupal/modules!system!language.api.php/를 … (로케일 모듈이 사용하는) 여러 도메인을 처리하는 언어 협상 공급자를 정의하려면 ??
leon.nk

@ leon.nk 해당 모듈을 찾지 못했습니다. 힌트를 주셔서 감사합니다. 아마 당신이 옳고 hook_language_negotiation_info가 사용하기에 가장 적합한 고리입니다. 시도해 볼게.
user5950

language_multidomain 모듈이 더 이상 존재하지 않는 것 같습니다.
Matthias Urlichs

위의 후크가 hook_language_init ()이어야 합니까? hook_api_language_init () 가 없습니다 . hook_language_switch_links_alter () 로 언어 전환기 링크를 업데이트해야합니다 .
colan

@colan 사용자 지정 모듈 custom_api과 후크 가 호출 hook_language_init()됩니다. 함께입니다 custom_api_language_init(). 이것이 혼란 스러울 수 있으므로 그 요점을 분명히하기 위해 예제를 편집했습니다. ‘hook_language_switch_links_alter ()’를 사용하는 것이 더 좋습니다. 그러나이 문제에 관심이있는 사람은 거의 없으므로이 예제를 다시 작성하는 것이 가치가 없다고 생각합니다.
user5950
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.