繁体   English   中英

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

[英]Nginx Rewrite domain to Subfolder excluding trailing slash

我试图重写一个域以包含一个语言路径但没有尾部斜杠。

所以

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

在POST的情况下,重定向降级为GET(这是正常行为)。 307响应可用于使用新URI重复POST。 请参阅此页面了解更多信息

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

识别不以开头的URI的一种方法/en ,是使用location ^~ /en块来处理那些开头的所有的URI /en ,并使用正则表达式所在地块来捕捉一切。

例如:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM