1

modrewrite アクセス ルールの記述が苦手で、次のシナリオを実現したいと考えています。

virtual url /en/shop.php redirects to /shop.php?lang=en

すでにそれを取得していますが、実際の問題は modrewrite 環境内にあります。

if url is '/' (empty)     --> redirect to /en/  (/index.php?lang=en)
if url is '/en' or '/de'  --> redirect to /en/ or /de/ (add slash)
if an uri is "defined" like /en/shop.php -> redirect to /shop.php?lang=en

いくつかのルールを試しましたが、最後のルールは無限ループになり、何が問題なのかわかりません.. :/助けてください

ここに私の .htaccess ファイルがあります:

RewriteEngine On
RewriteBase /   

# empty url -> redirect to en/
RewriteRule ^$ en/ [R=301,L]

# url is ONLY '/en' or '/de' -> redirect to /en/ or /de/ (adding slash)
RewriteRule ^(en|de)$  $1/ [R=301,L]

# now all urls have en/ de/ -> parse them
RewriteRule ^(en|de)/(.*)$  $2?lang=$1&%{query_STRING} [R=301,L]
4

1 に答える 1

2

これは、リダイレクト ループを引き起こしている行です。

RewriteRule ^(en|de)/(.*)$  $2?lang=$1&%{query_STRING} [R=301,L]

/?lang=enブラウザを(たとえば)にリダイレクトしているためです。次に、最初のルール:

RewriteRule ^$ en/ [R=301,L]

にリダイレクトし/en/?lang=en、最後のルールによって にリダイレクトされ/?lang=en、次に最初のルールにリダイレクトされます。

おそらく、最後のルールは内部的なものであると考えていました。さらに、最初のルールでは、クエリ文字列パラメーター「lang」が既に存在するかどうかを確認する必要があります。

RewriteEngine On
RewriteBase /   

# empty url -> redirect to en/
RewriteCond %{QUERY_STRING} !lang=(en|de)
RewriteRule ^$ en/ [R=301,L]

# url is ONLY '/en' or '/de' -> redirect to /en/ or /de/ (adding slash)
RewriteRule ^(en|de)$  $1/ [R=301,L]

# now all urls have en/ de/ -> parse them
RewriteRule ^(en|de)/(.*)$  $2?lang=$1&%{query_STRING} [L]
# no "R=301" here --------------------------------------^
于 2013-07-04T16:59:18.373 に答える