

現在下記構成の多言語対応サイトを作っています。  
英語版：/en  
日本語版：/ja  
中国語版：/zh

[code]

    RewriteBase /
    RewriteCond %{HTTP:Accept-Language} ^ja [NC]
    RewriteRule ^$ /ja/ [L,R=301]
    RewriteCond %{HTTP:Accept-Language} ^zh [NC]
    RewriteRule ^$ /zh/ [L,R=301]
    RewriteRule ^$ /en/ [L,R=301]
    
[/code]

現在は上記を.htaccessに記載しており正常に動作していますが例えば「/book/」にアクセスした際に「/ja/book/」に飛ばしたいのですが「/ja/」に飛ばされてしまいます。

[code]

    RewriteBase /
    
    RewriteCond %{REQUEST_URI}  !(^/ja/)
    RewriteCond %{HTTP:Accept-Language} ^ja [NC]
    RewriteRule ^(.*)$ /ja/$1 [L,R=301]
    
    RewriteCond %{REQUEST_URI}  !(^/zh/)
    RewriteCond %{HTTP:Accept-Language} ^zh [NC]
    RewriteRule ^(.*)$ /zh/$1 [L,R=301]
    
    RewriteCond %{REQUEST_URI}  !(^/en/)
    RewriteRule ^(.*)$ /en/$1 [L,R=301]
    
[/code]

上記のように書くと「/ja/」と「/en/」で無限ループになってしまいます。  
無限ループにならないような書き方はどのようにすればよいでしょうか。


CC BY-SA 4.0
2022-06-25T13:12:49.007
89591
2022-06-28T00:13:55.777
53229
question
apache .htaccess
多言語サイトの振り分けでの.htaccessの書き方について


>
[code]

>     RewriteCond %{REQUEST_URI}  !(^/en/)
>  
[/code]

という条件ですと `/ja/～` や `/zh/～`
もマッチしてしまうからでしょう。リダイレクト済みの３言語については先にマッチを終了させておくのはどうでしょうか。

[code]

    RewriteBase /
    
    RewriteCond %{REQUEST_URI} ^/(ja|zh|en)/
    RewriteRule .* - [L]
    
    RewriteCond %{HTTP:Accept-Language} ^ja [NC]
    RewriteRule ^(.*)$ /ja/$1 [L,R=301]
    
    RewriteCond %{HTTP:Accept-Language} ^zh [NC]
    RewriteRule ^(.*)$ /zh/$1 [L,R=301]
    
    RewriteRule ^(.*)$ /en/$1 [L,R=301]
    
[/code]


CC BY-SA 4.0
2022-06-26T14:10:00.510
89613
2022-06-26T14:10:00.510
4236
89591
answer


回答ありがとうございます、解決しました。  
ただご提示いただいた内容だと無限ループになるようです。

冗長ではありますが下記で解決しました。

[code]

    RewriteCond %{REQUEST_URI} !^/(ja|zh|en)/
    RewriteCond %{HTTP:Accept-Language} ^ja [NC]
    RewriteRule ^(.*)$ /ja/$1 [L,R=301]
    RewriteCond %{REQUEST_URI} !^/(ja|zh|en)/
    RewriteCond %{HTTP:Accept-Language} ^zh [NC]
    RewriteRule ^(.*)$ /zh/$1 [L,R=301]
    RewriteCond %{REQUEST_URI} !^/(ja|zh|en)/
    RewriteRule ^(.*)$ /en/$1 [L,R=301]
    
[/code]


CC BY-SA 4.0
2022-06-27T16:12:30.070
89635
2022-06-28T00:13:55.777
2022-06-28T00:13:55.777
3060
53229
89591
answer