2017-05-25 55 views
1

我已经通过.htaccess隐藏PHP扩展。Mod_rewrite通过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/

.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

您有什么想法吗?

+0

你能有'www.mysite.com/etc.php LANG = EN&ID = 123&PARAM = abc'也?如果是,那么它应该重定向到哪个URL? – anubhava

+0

@anubhava是的,如果有'lang = en',它应该像这样:'www.mysite.com/en/...'这样的域,所以如果你问:'www.mysite.com/烯的/ etc/123/ABC /'。 – Infinity

+0

嗯,这使得重写工作真的很难,因为主机名后面的第一部分有时可能是语言代码或php文件名。在同一个URL的'/ en /'开始处是否也可以有'/ ft /'或'/ de /'或'/ it /'? – anubhava

回答

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] 
+0

比你的答案,但它没有奏效。当我尝试访问'www.mysite.lt'时,出现错误:'在此服务器上未找到请求的URL/lt /。' – Infinity

+0

除了'lang = lt'之外,它几乎可以工作。如果我传递给地址栏,如:'http://mysite.lt/register.php?lang = lt&id = 123456789&param = abcd'它不会将url转换为http:// mysite.lt/register/123456789/abcd',但如果我使用'lang = en',它通常工作在http:// mysite。http://mysite.lt/register.php?lang = en&id = 123456789&param = abcd'。lt/en/register/123456789/abcd',当'lang'参数为'lt'时出现错误' – Infinity

+1

非常感谢,看起来像工作正常! – Infinity