用于网页翻译的Mod_rewrite .htaccess

时间:2017-05-29 17:42:42

标签: php apache .htaccess redirect mod-rewrite

现在我 <td> <span v-if="user.editmode"> <select v-model="user.city_id" required> <option v-for="option in citiesByCountry[user.country_id]" :value="option.id">{{option.val}}</option> </select> </span> <span v-else>{{user.city}}</span> </td> <td> <span v-if="user.editmode"> <select v-model="user.country_id" required> <option v-for="option in countries" :value="option.id">{{option.val}}</option> </select> </span> <span v-else>{{user.country}}</span> </td> 想出来了:

.htaccess参数可以是langen

如果lt参数的值= lang,则在域之后添加en

en/ - &gt; www.mysite.com/register.php?lang=en

如果www.mysite.com/en/register/参数的值= lang,则表示如下:

lt - &gt; www.mysite.com/register.php?lang=lt

如果使用任何其他参数,则类似:

www.mysite.com/register/ - &gt; 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按钮时工作不正确,网址如下:

enwww.mysite.lt/register/?lang=enwww.mysite.lt/?lang=en

而不是

www.mysite.lt/?lang=ltwww.mysite.lt/en/register/www.mysite.lt/en/

www.mysite.lt/文件现在看起来像:

.htaccess

您知道问题出在哪里吗?

1 个答案:

答案 0 :(得分:1)

将您的前2个重定向规则更改为:

完成.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]