首页 > 解决方案 > Nginx 正则表达式

问题描述

我正在尝试进行以下重写:

maindomain.com/country/everythingExceptWork 重定向到国家 url

location ~ ^/france(?:/(?!work))(?:(.*))$ {
return         301 https://www.maindomain.com/fr/france/;
}

maindomain.com/anycountry/works 重定向到单个 url

  location ~ ^/(spain|italy|france)/work$ {
  return         301 https://www.maindomain.com/en/works/;
  }

问题是,当我测试 maindomain.com/country/ 时它可以工作,但是如果我测试它 maindomain.com/country(没有最后一个斜杠),它将使用默认规则,当我更改时,这个问题就开始了:

this:      location ~ ^/spain(?:/(.*))?$ {
for this:  location ~ ^/spain(?:/(?!work))(?:(.*))$ {

NGINX 会议:

server {
  listen 80;
  server_name maindomain.com;
  return 301 https://$host$request_uri;
}

server {
 listen 443 ssl;
 server_name maindomain.com;
 ssl on;

  ssl_certificate /etc/nginx/ssl/server.crt;
  ssl_certificate_key /etc/nginx/ssl/server.key;
  ssl_dhparam  /etc/nginx/ssl/dhparam.pem;

#reverse proxy
#Default
  location / {
  return         301 https://www.maindomain.com;
  }

#Work ALL COUNTRIES
  location ~ ^/(spain|italy|france)/work$ {
  return         301 https://www.maindomain.com/en/works/;
  }

#France
  location ~ ^/france(?:/(?!work))(?:(.*))$ {
  return         301 https://www.maindomain.com/fr/france/;
  }


#Spain
  location ~ ^/spain(?:/(?!work))(?:(.*))$ {
  return         301 https://www.maindomain.com/es/spain/;
  }

#Italy
  location ~ ^/italy(?:/(?!work))(?:(.*))$ {
  return         301 https://www.maindomain.com/en/italy/;
  }

}

我在此更改中缺少什么以包括带或不带斜线的国家/地区?

this:      location ~ ^/spain(?:/(.*))?$ {
for this:  location ~ ^/spain(?:/(?!work))(?:(.*))$ {

提前致谢!

标签: regexnginxurl-rewriting

解决方案


正则表达式上的最后一个问题符号location ~ ^/spain(?:/(.*))?$使第二个斜线和以下所有内容成为可选部分。要保留斜杠可选,您需要将您的正则表达式从

location ~ ^/spain(?:/(?!work))(?:(.*))$ { ... }

location ~ ^/spain(?:/(?!work).*)?$ { ... }

要保留第一个捕获组,请使用

location ~ ^/spain(?:/(?!work)(.*))?$ { ... }

推荐阅读