2

私は3つの言語の多言語サイトを持っており、次のルールを使用して、ブラウザーの受け入れ言語に基づいて適切なバージョンのWebサイトに要求をリダイレクトしています。

#swedish
RewriteCond %{HTTP:Accept-Language} ^sv.*$ [NC]
RewriteCond %{REQUEST_URI} ^/$ [NC]
RewriteCond %{QUERY_STRING} !(^q\=) [NC]
RewriteRule ^(.*)$ /sv [L,R=301]

#norwegian bokmal
RewriteCond %{HTTP:Accept-Language} ^nb.*$ [NC]
RewriteCond %{REQUEST_URI} ^/$ [NC]
RewriteCond %{QUERY_STRING} !(^q\=) [NC]
RewriteRule ^(.*)$ /nb [L,R=301]

#norwegian
RewriteCond %{HTTP:Accept-Language} ^no.*$ [NC]
RewriteCond %{REQUEST_URI} ^/$ [NC]
RewriteCond %{QUERY_STRING} !(^q\=) [NC]
RewriteRule ^(.*)$ /nb [L,R=301]

#all others go to english
RewriteCond %{REQUEST_URI} ^/$ [NC]
RewriteCond %{QUERY_STRING} !(^q\=) [NC]
RewriteRule ^(.*)$ /en [L,R=301]

サブドメインも維持しながら同じリダイレクトを行うには、このルールをアップグレードする必要があります

Example for a norwegian request:
www.domain.com/subdomain -> www.domain.com/nb/subdomain

どうすればこれを達成できますか?

現在のルールを手伝ってくれた@faaに感謝します。

4

2 に答える 2

2

アップデート

質問の説明

コメントのページとサブドメインの問題に関しては、この特定のケースでは関係ありません。事実、あなたの質問の受信URLは www.domain.com/subdomainであり、名前を除いて、/subdomain明らかにページです。

実際のサブドメインは確かに別のドメインの一部であるドメインであり、それを保持するURL形式はのようなものなsubdomain.domain.comので、私の側では混乱はありませんでした。

十分に明確ではないのは、リダイレクトがどのように処理されるかです。あなたの質問によると、「サブドメイン」をパス全体に置き換えると、いくつかの例があります。

  1. www.domain.com/に行く必要があります www.domain.com/LangCode/、(以前の作業リダイレクト)

  2. www.domain.com/pageに行く必要があります www.domain.com/LangCode/page

  3. www.domain.com/page1/page2/page3/etc/に行く必要があり www.domain.com/LangCode/page1/page2/page3/etcます。この可能性は問題ではありませんが、最終的には必要になる可能性があります。

このような場合、受信URLとリダイレクトURLのページは同じ名前である必要がありますが、受信URLに存在する必要はありませんが、リダイレクトURLにページが存在する必要があるため、デフォルトのスクリプト(index.phpまたはindex.htmlなど)リクエストを処理します。

つまり、リダイレクトの対象となる各ページにスクリプトが必要です。言語ごとに少なくとも2つと言います。

私が理解している限り、それは質問と補足コメントが示していることですが、それは実際的なアプローチではないようです。

推奨される解決策

より良いアプローチは、すべてのリクエストを処理するルートフォルダにある単一のスクリプトです。これは、例を使用してより適切に説明できるアイデアです。

  1. www.domain.com/常にブラウザのアドレスバーに表示されますが、内部的に www.domain.com/lang_handler.php?lang=svまたはに移動します

  2. www.domain.com/page1/常にブラウザのアドレスバーに表示されますが、内部的にはwww.domain.com/lang_handler.php?lang=sv&target_page1=page1

これは、mod_rewriteディレクティブを使用して.htaccessで実現できます。次に例を示します。

RewriteEngine On
RewriteBase  /

# Set managed languages here, except default (en)
RewriteCond %{HTTP:Accept-Language} ^(sv|ne|no).*$ [NC]

# Replace the names of the script and the parameters in the next 2 lines
RewriteCond %{REQUEST_URI} !lang_handler\.php              [NC]
RewriteRule ^([^/]+)?/?$  lang_handler.php?lang=%1&target_page1=$1  [L,QSA]

# If no match, set English
# Replace the names of the script and the parameters in the next 2 lines
RewriteCond %{REQUEST_URI}  !lang_handler\.php             [NC]
RewriteRule ^([^/]+)?/?$  lang_handler.php?lang=en&target_page1=$1  [L,QSA]

上記のルールセットはサイレントにマップします

http://www.domain.com/またhttp://www.domain.com/page1

http://www.domain.com/lang_handler.php?lang=LangCode&target_page1=page1

はどこLangCodeにありますか、sv ne noまたはenデフォルトです。

この例は、1ページまたはページなしでのみ機能します。ただし、任意の数のページを処理できますが、それに応じてルールを変更する必要があります。より多くのパラメーターと正規表現グループをRewriteRulesに追加する必要があります。

于 2013-01-18T00:18:14.097 に答える
0

$1でうまくいくはずです。

RewriteCond %{HTTP:Accept-Language} ^no.*$ [NC]
RewriteCond %{REQUEST_URI} ^/$ [NC]
RewriteCond %{QUERY_STRING} !(^q\=) [NC]
RewriteRule ^(.*)$ /nb/$1 [L,R=301]
于 2013-01-17T11:10:55.233 に答える