2017-05-25 53 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