web-dev-qa-db-ja.com

1つの言語に複数のドメインを設定する方法

私はmultilingualのサイトでDrupal 7を使用し、en.example.comのようなサブドメインを使用して言語を検出しています。すべてが期待どおりに動作しますが、モバイルバージョンのen.m.example.comなどのドメインからアクセスできるようにしたいウェブサイトの魔女これを行うにはどうすればよいですか?admin/config/regional/language言語ごとに1つのドメインのみですが、それを機能させるために次のように2つのドメインを設定する必要があります。

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にリクエストを送信できますが、すべての内部リンクにより、ユーザーはモバイルバージョンから通常のバージョンに戻ります。この問題を解決するにはどうすればよいですか?

15
user5950

答えは次のとおりです。Drupal 7では、1つの言語で複数のドメインを使用することは不可能であり、私の知る限り、その機能を追加するモジュールはありません。

しかし、とにかくこの目的を達成するための回避策があります。上記のように、言語ドメインの問題は、言語固有のパスエイリアスを持ち、Drupalコア関数で作成されたすべての内部パスです。 url()は絶対パスとして作成されます。その動作の責任は function です。

locale_language_url_rewrite_url(&$path, &$options)
  1. そのデフォルト言語に言語ドメインを設定しないでください。これを行わない場合、Drupalはデフォルト言語の絶対パスを作成しません。たとえば-ドメインを使用する場合xyz.example.com、xyz.example.comがどの言語のドメインとしても設定されていない場合、Drupalは相対URLを作成するため、内部リンクをクリックするとサブドメインが保持されます。ただし、上記のように言語に依存するサブドメインが必要な場合は、この方法を使用できません。

    英語の場合:en.example.com&en.m.example.com

    ドイツ語の場合:de.example.com&de.m.example.comなど.

  2. したがって、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;
    }
  }
}
2
user5950

Drupalを設定して、異なるドメインで異なる言語を提供するようにしたら、複数のドメインから同じDrupalにリクエストを送信するようにWebサーバーに指示する必要があります地点。

Apacheでは、.conf (httpd.conf)ファイルを編集して、すべての異なるドメインにエイリアスを追加する必要があります。例えば:

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

これに加えて、さまざまな言語のすべてのドメイン名について、ドメインネームサーバー(DNS)がサーバーを指すようにする必要もあります。

5
monymirza