Mod_rewrite .htaccess用于网络翻译 [英] Mod_rewrite .htaccess for web translating
问题描述
目前,我已经.htaccess
想通了:
lang
参数可以是en
或lt
如果lang
参数的值= en
大于en/
,则在这样的域后添加en/
:
If lang
parameter's value = en
than It adding en/
after domain like that:
www.mysite.com/register.php?lang=en
-> www.mysite.com/en/register/
如果lang
参数的值= lt
则类似于:
If lang
parameter's value = lt
than it is like that:
www.mysite.com/register.php?lang=lt
-> www.mysite.com/register/
如果使用其他任何参数,则类似于:
If any other parameter is used, is like that:
www.mysite.com/etc.php?id=123¶m=abc
-> www.mysite.com/etc/123/abc/
当我直接将其键入地址栏时,它可以正常工作,但是问题是单击按钮以更改语言时.我有导航和按钮可以像这样更改语言:
When I type it directly to address bar it working correctly, but problem is when clicking button to change language. I have navigation and buttons to change language like that:
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
按钮时,它无法正常工作,并且网址如下:
When lt
or en
button is clicked It working incorrectly and url looks like:
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]
您知道问题出在哪里吗?
Have you idea where is the problem?
推荐答案
将您的前2个重定向规则更改为此:
Change your top 2 redirect rules to this:
完成.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]
这篇关于Mod_rewrite .htaccess用于网络翻译的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!