Назад | Перейти на главную страницу

Nginx динамическое создание поддоменов с использованием пути URL

Я пытаюсь переписать / перенаправить на определенные поддомены, если путь запроса URL-адреса соответствует некоторому шаблону.

Я бы хотел сделать что-то подобное, если получу запрос типа "https://example.com/users/john/likes"Я хочу служить этому как"https://john.example.com/likes"

Вот что пробовали до сих пор: я могу создать такое местоположение, как

`location ~ ^/users {
    #TODO: some magic
   }`

пробовал много способов захватить часть «john» uri с помощью регулярного выражения, но безуспешно, очень новый в регулярном выражении какие-либо мысли о том, как этого добиться?

Обновление: как указано в ответе, мне нужно обслуживать запросы от nginx conf, вот конфигурация, которую я использую, обратите внимание, что я тестирую это в поддомене:

server {

  listen 80;
  server_name staging.example.com;
  return 301 https://staging.example.com$request_uri;
}


map $name $uri_prefix {

  ~(.+)$ /users/$1;
}


# This is the new server block I created which will serve the subdomain requests I think i can write conditions in one server block

server {

  listen 443 ssl;
  server_name ~^(?<name>[^\.]+)\.example\.com$;
  client_max_body_size 1000m;
  add_header X-UA-Compatible "IE=Edge,chrome=1";
  root /home/something/app/;

  access_log /var/log/nginx/access.log;
  error_log /var/log/nginx/error.log;

  ssl_certificate /etc/nginx/ssl/app.crt;
  ssl_certificate_key /etc/nginx/ssl/app.key;

  error_page 500 502 503 504 /500.html;

  location / {

    try_files $uri @prerender;
  }

  location @prerender {

    set $prerender 0;
    if ($http_user_agent ~* "googlebot|bingbot|yandex|baiduspider|twitterbot|facebookexternalhit|rogerbot|linkedinbot|embedly|quora link preview|showyoubot|outbrain|pinterest|slackbot|vkShare|W3C_Validator") {

      set $prerender 1;
    }
    if ($args ~ "_escaped_fragment_") {

      set $prerender 1;
    }
    if ($http_user_agent ~ "Prerender") {

      set $prerender 0;
    }
    if ($uri ~* "\.(js|css|xml|less|png|jpg|jpeg|gif|pdf|doc|txt|ico|rss|zip|mp3|rar|exe|wmv|doc|avi|ppt|mpg|mpeg|tif|wav|mov|psd|ai|xls|mp4|m4a|swf|dat|dmg|iso|flv|m4v|torrent|ttf|woff|svg|eot)") {

      set $prerender 0;
    }

    #resolve using Google's DNS server to force DNS resolution and prevent caching of IPs
    resolver 8.8.8.8;

    if ($prerender = 1) {

      #setting prerender as a variable forces DNS resolution since nginx caches IPs and doesnt play well with load balancing
      set $prerender "staging-render.example.com:3000";
      rewrite .* /$scheme://$host$request_uri? break;
      proxy_pass http://$prerender;
    }
    if ($prerender = 0) {

      rewrite ^(.*)$ $uri_prefix$1;
    }
  }
}

server {

  listen 443 ssl;
  server_name staging.example.com;
  client_max_body_size 1000m;
  add_header X-UA-Compatible "IE=Edge,chrome=1";
  root /home/something/app/;

  access_log /var/log/nginx/access.log;
  error_log /var/log/nginx/error.log;

  ssl_certificate /etc/nginx/ssl/app.crt;
  ssl_certificate_key /etc/nginx/ssl/app.key;

  error_page 500 502 503 504 /500.html;

  location / {

    try_files $uri @prerender;
  }

  location = /sitemap.xml.gz {

    root /home/ubuntu/site_maps;
  }

  location @prerender {

    set $prerender 0;
    if ($http_user_agent ~* "googlebot|bingbot|yandex|baiduspider|twitterbot|facebookexternalhit|rogerbot|linkedinbot|embedly|quora link preview|showyoubot|outbrain|pinterest|slackbot|vkShare|W3C_Validator") {

      set $prerender 1;
    }
    if ($args ~ "_escaped_fragment_") {

      set $prerender 1;
    }
    if ($http_user_agent ~ "Prerender") {

      set $prerender 0;
    }
    if ($uri ~* "\.(js|css|xml|less|png|jpg|jpeg|gif|pdf|doc|txt|ico|rss|zip|mp3|rar|exe|wmv|doc|avi|ppt|mpg|mpeg|tif|wav|mov|psd|ai|xls|mp4|m4a|swf|dat|dmg|iso|flv|m4v|torrent|ttf|woff|svg|eot)") {

      set $prerender 0;
    }

    #resolve using Google's DNS server to force DNS resolution and prevent caching of IPs
    resolver 8.8.8.8;

    if ($prerender = 1) {

      #setting prerender as a variable forces DNS resolution since nginx caches IPs and doesnt play well with load balancing
      set $prerender "staging-render.example.com:3000";
      rewrite .* /$scheme://$host$request_uri? break;
      proxy_pass http://$prerender;
    }
    if ($prerender = 0) {

      rewrite .* /index.html break;
    }
  }
}

Если вы хотите получать HTTP-перенаправление с такими URI, попробуйте следующее:

server {
    ...
    server_name www.example.com example.com;
    ...
    location ~ ^/users/([^/]+)(.*)$ {
        return 301 $scheme://$1.example.com$2;
    }
    ...
}

Но с вашим вопросом неясно, нужно ли вам обслуживать эти поддомены с конфигурацией nginx? Это можно сделать с помощью дополнительных server блок:

map $name $uri_prefix {
    ~(.+)$ /users/$1;
}

server {
    ...
    server_name ~^(?<name>[^\.]+)\.example\.com$;
    ...
    rewrite ^(.*)$ $uri_prefix$1; # do an internal URI rewriting not visible to the end user
    ...
    # process a rewrited request (now in the form "/users/username/...")
}

Не пытайтесь совместить эти два server блок за один, или вы получите бесконечный цикл.

Вы можете попробовать следующее правило nginx:

if ($request_uri ~* "^/users/(.*)/(.*)"){ 
    return 301 hhttps://$1.example.com/$2;
}