Mod_rewrite .htaccess用于网络翻译 [英] Mod_rewrite .htaccess for web translating

查看:39
本文介绍了Mod_rewrite .htaccess用于网络翻译的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

目前,我已经.htaccess想通了:

lang参数可以是enlt

如果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&param=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>

单击lten按钮时,它无法正常工作,并且网址如下:

When lt or en button is clicked It working incorrectly and url looks like:

www.mysite.lt/register/?lang=enwww.mysite.lt/?lang=enwww.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]

您知道问题出在哪里吗?

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&]+)&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]

这篇关于Mod_rewrite .htaccess用于网络翻译的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆