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


15

私が持っている言語を検出するen.example.comのようなサブドメインを使用してのDrupal 7でサイトを。すべてが期待どおりに動作しますが、en.m.example.comなどのドメインからアクセスできるようにしたいWebサイトwitchのモバイルバージョンがあります。これを行うにはどうすればよいですか。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にリクエストを送信できますが、すべての内部リンクはユーザーをモバイルバージョンから通常の状態に戻します。この問題を解決するにはどうすればよいですか?


1
これは本当にあなたの質問に正確に答えるわけではありませんが、別々のモバイルサイトを持たない方が良いでしょう。モバイル用に変化するレスポンシブレイアウトを使用する方が良いでしょう。エクスペリエンスが向上し、保守が容易になり、ブラウザーの検出とサイトの切り替えのマイナス面をスキップできます。-ただし、設計/テーマ設定に少し投資する必要があります。
ルービー

ありがとう、私はこれが一般的に最高であることを知っています。しかし、私のウェブサイトの使用例は、モバイルユーザーと通常のユーザーでは異なります。そのため、配信される機能とコンテンツも異なります。そのため、私にはそのオプションがありません。
user5950

これがわかりません!これは基本的なことです。モバイルテーマのサブドメインと組み合わせて言語ドメインでDrupalを使用できる必要があります。Drupalでこれをしている人はいないでしょうか?
user5950

回答:


5

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

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

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

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


私にはうまくいきません。問題は、上記のように言語選択に異なるドメインを使用すると、すべての内部リンクが絶対パスとして作成されることです。したがって、en.example.comとen.m.example.comを使用してページにアクセスできますが、en.m.example.comの下のすべての内部リンクには2番目のサブdominがありません。たとえば、サブページへのリンクはen.example.com/node/1234に似ていますが、en.m.example.com / node / 1234のようになります。
user5950

2

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

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

locale_language_url_rewrite_url(&$path, &$options)
  1. そのデフォルト言語の言語ドメインを設定しないでください。そうしないと、たとえば、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;
    }
  }
}

このモジュールは似たような ことをすると思います:drupal.org/project/language_multidomain BUT ...なぜこのフックを使用できないのか疑問に思います:api.drupal.org/api/drupal/modules!system!language.api.php/ …(ロケールモジュールが使用するもの)複数のドメインを処理する言語ネゴシエーションプロバイダーを定義しますか??
leon.nk

@ leon.nkそのモジュールは見つかりませんでした、そのヒントをありがとう。たぶんあなたは正しいですし、hook_language_negotiation_infoが使用するのに適切なフックです。私はそれを試してみます。
user5950

どうやらlanguage_multidomainモジュールはもう存在しません。
マティアスユリックス

上記のフックはhook_language_init()であってはなりませんか?hook_api_language_init()はありません。また、hook_language_switch_links_alter()使用して言語スイッチャーリンクを更新する必要があります。
コラン14

@colanカスタムモジュールが呼び出さcustom_apiれ、フックが作成されますhook_language_init()。一緒ですcustom_api_language_init()。混乱するかもしれませんので、その点を明確にするために例を編集しました。あなたは正しい、「hook_language_switch_links_alter()」を使用するのがより良い方法かもしれません。しかし、この問題に関心を持っている人はほとんどいないように思えるので、この例を書き直す価値はないと思う。
user5950 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.