【问题标题】:Mod_rewrite .htaccess for web translating用于网络翻译的 Mod_rewrite .htaccess
【发布时间】:2017-10-30 02:05:11
【问题描述】:

现在我有 .htaccess 这样想出:

lang 参数可以是enlt

如果 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>

lten 按钮被点击时,它工作不正常,url 看起来像:

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]

你知道问题出在哪里吗?

【问题讨论】:

  • 既然您似乎只有两种语言,为什么不直接链接到规范 URL(如果您愿意,可以将它们设置为按钮)? (大概您已经将应用内 URL 更改为规范 URL?尽管您上面的 HTML 表明您可能没有并且正在依赖 .htaccess 中的重定向??)

标签: php apache .htaccess redirect mod-rewrite


【解决方案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]

【讨论】:

  • 感谢您的帮助,但这次出了点问题。如果我输入www.mysite.lt/en/ 我得到404 error - Not Found。另外,如果我转到www.mysite.lt/register/ 并尝试将语言更改为en,我得到的地址类似于www.mysite.lt/register/?lang=en 和同样的错误。
  • 现在看起来lt 按钮根本不起作用,它刷新了页面,但语言没有改变。如果我单击一次en 按钮,没关系,地址栏看起来像www.mysite.lt/en/,但是如果我第二次单击en 按钮,它会再添加一次en/,地址栏看起来像www.mysite.lt/en/en/,我得到了错误Not Found。也许我的按钮有问题?
  • 我在我的问题中提供了按钮定义。更改语言的按钮被传递给带有method="get"的表单。进入register.php的按钮看起来像&lt;a href="register.php"&gt;Register&lt;/a&gt;。关于我没有收到任何错误,只是 lt 按钮没有更改语言。
  • 关于第二次点击en按钮添加第二个en/www.mysite.lt/en/en/时出现的问题.htacccess看起来像问题?
  • 终于!太感谢了! ++++
猜你喜欢
  • 2017-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
相关资源
最近更新 更多