На данный момент у меня есть .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¶m=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&]+)¶m=([^\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&]+)¶m=([^\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¶m=$4 [L,NC,QSA]
Вы знаете, где проблема?
Измените два правила переадресации:
Полный .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&]+)¶m=([^\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&]+)¶m=([^\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¶m=$4 [L,NC,QSA]