Nginx将域重写为子文件夹,不包括尾部斜杠

时间:2017-04-16 18:20:53

标签: redirect 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请求造成严重破坏。

1 个答案:

答案 0 :(得分:0)

如果是POST,重定向将降级为GET(这是正常行为)。 307响应可用于使用新URI重复POST。有关详情,请参阅this page

在这种情况下,您需要重写配置以使用return 307语句。您可以使用正则表达式位置块来捕获URI而不使用其尾随/。有关详情,请参阅this document

识别不以/en开头的URI的一种方法是使用location ^~ /en块来处理/en开头的所有URI,并使用正则表达式位置块捕获其他所有内容。

例如:

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