我已经完成了通过.htaccess
隐藏PHP扩展程序。
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¶m=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 :(得分:1)
让你的root .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]