【问题标题】:Mod_rewrite for website translating via htaccessMod_rewrite 用于通过 htaccess 进行网站翻译
【发布时间】:2017-10-26 08:05:28
【问题描述】:

我已经通过 .htaccess 隐藏 PHP 扩展。

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/

我的.htaccess 看起来像:

Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /

# url is ONLY '/en' or '/lt' -> redirect to /en/ or /lt/ (adding slash)
RewriteRule ^(en|lt)$  $1/ [R=301,L]
# now all urls have en/ lt/ -> parse them
RewriteRule ^(en|lt)/(.*)$  $2?lang=$1&%{query_STRING} [L]
# no "R=301" here --------------------------------------^

RewriteCond %{THE_REQUEST} /+(.*?/)?(?:index)?(.*?)\.php[/\s?] [NC]
RewriteRule ^ %1%2/ [R=302,L,NE]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+?)/?$ $1.php [L]

但现在它工作不正常:

如果我有www.mysite.com/register.php?lang=en,它会将我重定向到www.mysite.com/register/?lang=en

你有什么想法吗?

【问题讨论】:

  • 你也可以有www.mysite.com/etc.php?lang=en&id=123&param=abc 吗?如果是,那么它应该重定向到哪个 URL?
  • @anubhava 是的,总是如果有lang=en 它应该像这样的域:www.mysite.com/en/... 所以如果你问过:www.mysite.com/en/etc/123/abc/
  • 嗯,这使得重写工作变得非常困难,因为主机名之后的第一部分有时可以是语言代码或 php 文件名。 /ft//de//it/ 也可以在同一个 URL 中与 /en/ 相同的开头吗?
  • 只有 2 种语言 - lten,但 lt 是默认的,我的域确实像 mysite.lt 所以如果 lt 语言我不需要添加它。如果lt 语言那么www.mysite.lt/etc/ 如果en 然后www.mysite.lt/en/etc/
  • @anubhava 好的,感谢您的帮助。

标签: php apache .htaccess redirect mod-rewrite


【解决方案1】:

让你的根 .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]

【讨论】:

  • 谢谢你的回答,但它没有用。当我尝试访问 www.mysite.lt 时出现错误:The requested URL /lt/ was not found on this server.
  • 它几乎可以工作,除了lang=lt。如果我传递到地址栏,例如:http://mysite.lt/register.php?lang=lt&id=123456789&param=abcd 它没有将 url 转换为 http://mysite.lt/register/123456789/abcd,但如果我使用lang=en 它工作正常http://mysite.lt/register.php?lang=en&id=123456789&param=abcd 转换为http://mysite.lt/en/register/123456789/abcd,当lang 参数为@ 时出现问题987654332@
  • 嘿,我在尝试通过单击按钮更改语言时遇到了另一个问题。我在这里问了另一个问题:stackoverflow.com/questions/44247981/…
猜你喜欢
  • 2017-10-30
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
  • 2014-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多