2017-04-16 69 views
1

我想重寫一個域來包含語言路徑,但沒有結尾的斜槓。Nginx重寫域到子文件夾不包括尾部的斜槓

所以

www.example.com => www.example.com/en

www.example.com/page/ => www.example.com/en/page

www.example.com/page => www.example.com/en/page

我目前使用此配置,但它不按預期工作。

server { 
    listen 80; 
    server_name www.example.com; 
    root /var/www/example.com/public; 
    rewrite ^/(.*)/$ /$1 permanent; 

    index index.php index.html; 

    location =/{ 
    return 301 http://www.example.com/en$request_uri; 
    } 
} 

主要地,

www.example.com => www.example.com/en/ => www.example.com/en

www.example.com/page => www.example.com/page

此代碼也對一些http_post請求造成嚴重破壞。

+0

'^重寫/(?EN /)/ EN $ REQUEST_URI重定向;' – Deadooshka

回答

0

在POST的情況下,重定向被降級爲GET(這是正常行爲)。 307響應可用於使用新的URI重複POST。有關更多信息,請參閱this page

在這種情況下,您需要重寫您的配置以使用return 307語句。您可以使用正則表達式位置塊來捕獲URI,而不會跟蹤它的尾部/。有關更多信息,請參閱this document。以確定不與/en開頭的URI

的一種方法,是使用location ^~ /en塊來處理所有的URI 開始/en,並使用正則表達式所在地塊來捕捉一切。

例如:

location =/{ 
    return 307 /en; 
} 
location ~ ^(/.*?)/?$ { 
    return 307 /en$1; 
} 
location ^~ /en { 
    ... 
} 
+0

你好理查德,感謝您的回答,但有一些事似乎第二位置規則將多個/ en添加到URL的末尾,就像它在循環中捕獲一樣 – tcherokee

+0

最後一個位置應該捕獲以'/ en'開頭的任何URI。 –