【发布时间】:2017-10-30 02:05:11
【问题描述】:
现在我有 .htaccess 这样想出:
lang 参数可以是en 或lt
如果 lang 参数的值 = en 比它在这样的域之后添加 en/:
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&]+)¶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]
你知道问题出在哪里吗?
【问题讨论】:
-
既然您似乎只有两种语言,为什么不直接链接到规范 URL(如果您愿意,可以将它们设置为按钮)? (大概您已经将应用内 URL 更改为规范 URL?尽管您上面的 HTML 表明您可能没有并且正在依赖
.htaccess中的重定向??)
标签: php apache .htaccess redirect mod-rewrite