Mod_rewrite .htaccess для веб-перевода

На данный момент у меня есть .htaccess :

lang может быть en или lt

Если значение параметра lang = en чем добавление en/ after домена:

www.mysite.com/register.php?lang=en -> www.mysite.com/en/register/

Если значение параметра lang = lt чем это:

www.mysite.com/register.php?lang=lt -> www.mysite.com/register/

Если какой-либо другой параметр используется, это выглядит так:

www.mysite.com/etc.php?id=123&param=abc -> www.mysite.com/etc/123/abc/

Когда я печатаю его непосредственно в адресной строке, он работает правильно, но проблема заключается в нажатии кнопки для изменения языка. У меня есть навигация и кнопки для изменения языка:

 if (!empty($_GET['lang'])) { setcookie('lang', $_GET['lang']); } <form action="" method="get"> <input id="lang-lt" type="submit" name="lang" value="lt"> <input id="lang-en" type="submit" name="lang" value="en"> </form> <li><a href="index.php">Home</a></li> <li><a href="register.php">Register</a> 

Когда нажата кнопка lt или en , она работает неправильно, и URL-адрес выглядит так:

www.mysite.lt/register/?lang=en или www.mysite.lt/?lang=en или www.mysite.lt/?lang=lt

вместо

www.mysite.lt/en/register/ или www.mysite.lt/en/ или www.mysite.lt/

.htaccess файл выглядит так:

 Options +FollowSymLinks -MultiViews RewriteEngine On RewriteBase / RewriteCond %{THE_REQUEST} \s/+(.+)\.php\?lang=(lt)\s [NC] RewriteRule ^ %1? [R=302,L,NE] RewriteCond %{THE_REQUEST} \s/+(.+)\.php\?lang=(en)\s [NC] RewriteRule ^ %2/%1? [R=302,L,NE] RewriteCond %{THE_REQUEST} \s/+(.+)\.php\?lang=(en)&id=([^\s&]+)\s [NC] RewriteRule ^ %2/%1/%3? [R=302,L,NE] RewriteCond %{THE_REQUEST} \s/+(.+)\.php\?lang=(en)&id=([^\s&]+)&param=([^\s&]+)\s [NC] RewriteRule ^ %2/%1/%3/%4? [R=302,L,NE] RewriteCond %{THE_REQUEST} \s/+(.+\.php)\?lang=lt&(\S*)\s [NC] RewriteRule ^ %1?%2 [L,NE,R=302] RewriteCond %{THE_REQUEST} \s/+(.+)\.php\?id=([^\s&]+)\s [NC] RewriteRule ^ %1/%2? [R=302,L,NE] RewriteCond %{THE_REQUEST} \s/+(.+)\.php\?id=([^\s&]+)&param=([^\s&]+)\s [NC] RewriteRule ^ %1/%2/%3? [R=302,L,NE] RewriteCond %{THE_REQUEST} \s/+(.*?/)?(?:index)?(.*?)\.php\s [NC] RewriteRule ^ %1%2/ [R=302,L,NE] # url is ONLY '/en' or '/lt' -> redirect to /en/ or /lt/ (adding slash) RewriteRule ^(en|lt)$ $1/ [R=301,L,NC] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{QUERY_STRING} !(^|&)lang=(en|lt)(&|$) [NC] RewriteRule ^(?!(?:en|lt)/)(.+)$ lt/$1 [DPI,NC] RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d [OR] RewriteCond %{DOCUMENT_ROOT}/$2.php !-f RewriteRule ^(en|lt)/([\w-]+)/?$ - [L] # now all urls have en/ lt/ -> parse them RewriteRule ^(en|lt)/([\w-]+)/?$ $2.php?lang=$1 [L,NC,QSA] RewriteRule ^(en|lt)/([\w-]+)/([\w-]+)/?$ $2.php?lang=$1&id=$3 [L,NC,QSA] RewriteRule ^(en|lt)/([\w-]+)/([\w-]+)/([\w-]+)/?$ $2.php?lang=$1&id=$3&param=$4 [L,NC,QSA] 

Вы знаете, где проблема?

Related of "Mod_rewrite .htaccess для веб-перевода"

Измените два правила переадресации:

Полный .htaccess:

 Options +FollowSymLinks -MultiViews RewriteEngine On RewriteBase / RewriteCond %{THE_REQUEST} \s/+(?:(?:index|(.+))\.php)?\?lang=lt\s [NC] RewriteRule ^ %1? [R=302,L,NE] RewriteCond %{THE_REQUEST} \s/+([^.?]+)/?\?lang=lt\s [NC] RewriteRule ^ %1? [R=302,L,NE] RewriteCond %{THE_REQUEST} \s/+(?:(?:index|(.+))\.php)?\?lang=(en)\s [NC] RewriteRule ^ %2/%1? [R=302,L,NE] RewriteCond %{THE_REQUEST} \s/+([^.?]+)/?\?lang=(en)\s [NC] RewriteRule ^ %2/%1? [R=302,L,NE] RewriteCond %{THE_REQUEST} \s/+(.+)\.php\?lang=(en)&id=([^\s&]+)\s [NC] RewriteRule ^ %2/%1/%3? [R=302,L,NE] RewriteCond %{THE_REQUEST} \s/+(.+)\.php\?lang=(en)&id=([^\s&]+)&param=([^\s&]+)\s [NC] RewriteRule ^ %2/%1/%3/%4? [R=302,L,NE] RewriteCond %{THE_REQUEST} \s/+(.+\.php)\?lang=lt&(\S*)\s [NC] RewriteRule ^ %1?%2 [L,NE,R=302] RewriteCond %{THE_REQUEST} \s/+(.+)\.php\?id=([^\s&]+)\s [NC] RewriteRule ^ %1/%2? [R=302,L,NE] RewriteCond %{THE_REQUEST} \s/+(.+)\.php\?id=([^\s&]+)&param=([^\s&]+)\s [NC] RewriteRule ^ %1/%2/%3? [R=302,L,NE] RewriteCond %{THE_REQUEST} \s/+(.*?/)?(?:index)?(.*?)\.php\s [NC] RewriteRule ^ %1%2/ [R=302,L,NE] # url is ONLY '/en' or '/lt' -> redirect to /en/ or /lt/ (adding slash) RewriteRule ^(en|lt)$ $1/ [R=301,L,NC] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{QUERY_STRING} !(^|&)lang=(en|lt)(&|$) [NC] RewriteRule ^(?!(?:en|lt)/)(.+)$ lt/$1 [DPI,NC] RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d [OR] RewriteCond %{DOCUMENT_ROOT}/$2.php !-f RewriteRule ^(en|lt)/([\w-]+)/?$ - [L] # now all urls have en/ lt/ -> parse them RewriteRule ^(en|lt)/$ index.php?lang=$1 [L,NC,QSA] RewriteRule ^(en|lt)/([\w-]+)/?$ /$2.php?lang=$1 [L,NC,QSA] RewriteRule ^(en|lt)/([\w-]+)/([\w-]+)/?$ /$2.php?lang=$1&id=$3 [L,NC,QSA] RewriteRule ^(en|lt)/([\w-]+)/([\w-]+)/([\w-]+)/?$ /$2.php?lang=$1&id=$3&param=$4 [L,NC,QSA]