2017-05-03 16 views
1

多言語のWebサイトを開発しています。言語はセッション変数として保存され、各言語のコンテンツは同じページに読み込まれます。効果的に英語のコンテンツの異なる翻訳が行われます。しかし、私は言語ごとに異なるURLが必要です。htaccess rewriteファイルからフォルダを削除します。

言語は常にURIの先頭に2文字のフォルダですが、英語にはフォルダがありません。たとえば:

www.mydomain.com/product/detail [English] 
www.mydomain.com/fr/product/detail [French] 
www.mydomain.com/de/product/detail [German] 
www.mydomain.com/ja/product/detail [Japanese] 

それらのURLのすべてがで同じファイルを取得します:ここで

www.mydomain.com/product-detail.php 

は私の現在のhtaccessのルールです:

# ==== REWRITE URLS ==== 
RewriteEngine On 

# Permanently redirect "foo.php" to "/foo"# 
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC] 
RewriteRule^/%1 [NE,L,R=301] 

# pass through root 
RewriteRule ^(index\.php|Sitemap\.xml)?$ - [L] 

# no more/so add extension 
RewriteCond $1 !/ 
RewriteCond $1 !\.php$ 
RewriteCond ${REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ /$1.php [L] 

RewriteCond %{REQUEST_URI} !\.php$ 
RewriteRule ^(_css|_includes|_assets|_scripts)($|/) - [L] #exclude these folders using the 'last: L' flag 
RewriteRule ^(.*)/(.*)$ /$1-$2 [L] 

# === end rewrite URLs === 

だから私は、余分な書き換えルールが必要'最初のフォルダが2文字で、FR | DE | JA'と一致する場合は無視しますが、既存のルールでも動作します。

htaccessファイルは私の力ではないとして、任意の助けいただければ幸いです...彼らは場所で少し、あいまいな矛盾や長ったらしいだとして

答えて

1

あなたのルールは、オーバーホールを行うことができます。

RewriteRule ^(?:(?:fr|de|ja)/)?(.*)/(.*)$ /$1-$2 [L] 

をこれだけのように、小文字の言語コードで動作します:それは明らかですので、それはさておき、彼らは関係なく、その作業している[1]、これに最後のルールを変更すると、それはあなたが尋ねると行う必要がありますように見えますあなたの例。あなたの説明のように、末尾の大括弧で囲まれたフラグを[L,NC]に変更することで、必要に応じて任意のケースをサポートするように変更することができます。また/productのようなURLで動作するように意味合いが意図したとおりに後から変更を加えることは動作しない可能性があることですか、期待通りにいくつかのものが

を動作しない場合があります更新

、でこれを追加してみてください -

1終了:

RewriteCond %{REQUEST_URI} !\.php$ 
RewriteRule ^(?:(?:fr|de|ja)/)(.*)$ /$1 [L] 

アップデート2

だから、最後に、それは次のようになります。

RewriteCond %{REQUEST_URI} !\.php$ 
RewriteRule ^(_css|_includes|_assets|_scripts)($|/) - [L] #exclude these folders using the 'last: L' flag 
RewriteRule ^(?:(?:fr|de|ja)/)?(.*)/(.*)$ /$1-$2 [L] 

RewriteCond %{REQUEST_URI} !\.php$ 
RewriteRule ^(?:(?:fr|de|ja)/)(.*)$ /$1 [L] 

を更新3

計画の変更、申し訳ありませんが、ちょうどそれが動作するつもりはないが実現。最後のセクションに2つ目の交換、代わりにこれを試してみてください:

# no more/so add extension 
RewriteCond $1 !/ 
RewriteCond $1 !\.php$ 
RewriteCond ${REQUEST_FILENAME} !-f 
RewriteRule ^(?:(?:fr|de|ja)/)?(.*)$ /$1.php [L] 

最後のセクションでは、バックに行く必要があります。

RewriteCond %{REQUEST_URI} !\.php$ 
RewriteRule ^(_css|_includes|_assets|_scripts)($|/) - [L] #exclude these folders using the 'last: L' flag 
RewriteRule ^(?:(?:fr|de|ja)/)?(.*)/(.*)$ /$1-$2 [L] 

そして、ちょうど繰り返すために、私はそれがない、全くこれを好きではありませんそれはうまくいくはずであり、すでに設定されている方法の自然な進歩です。本当にそれはすべて書き直す必要があります。

はここだけで明確にすることが、全体のことだ:

# ==== REWRITE URLS ==== 
RewriteEngine On 

# Permanently redirect "foo.php" to "/foo"# 
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC] 
RewriteRule^/%1 [NE,L,R=301] 

# pass through root 
RewriteRule ^(index\.php|Sitemap\.xml)?$ - [L] 

# no more/so add extension 
RewriteCond $1 !/ 
RewriteCond $1 !\.php$ 
RewriteCond ${REQUEST_FILENAME} !-f 
RewriteRule ^(?:(?:fr|de|ja)/)?(.*)$ /$1.php [L] 

RewriteCond %{REQUEST_URI} !\.php$ 
RewriteRule ^(_css|_includes|_assets|_scripts)($|/) - [L] #exclude these folders using the 'last: L' flag 
RewriteRule ^(?:(?:fr|de|ja)/)?(.*)/(.*)$ /$1-$2 [L] 

# === end rewrite URLs === 
+0

おかげで、それはURLのこのタイプのために動作します: 'mydomain.com/FR /製品/ detail'が、それはのような何かに404で失敗します。 'mydomain.com/fr/product' – Dodo

+0

私はその仕事をするルールを追加しました。お知らせ下さい。 – SuperDuperApps

+0

ありがとうございますが運はありません。これは逆順で動作します。 ''/product'は '' OK 'ですが、 ''/product/detail''は404です。この時点で、最後のルールは次のようになります: 'RewriteCond%{REQUEST_URI}!\ php $ RewriteRule ^(_ css | _includes | _assets | _scripts)($ | /) - [L] RewriteRule ^(?: (?:fr | de | ja)/)(。*)$/$ 1 [L] ' – Dodo

関連する問題