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

Перезапись (не перенаправление) URL-адреса в Nginx

У меня есть ситуация, которая, как мне кажется, немного отличается от большинства других. Это определенно отличается от всего, что я встречал раньше:

Я создаю сайт для клиента, который хочет / должен сохранить полный контроль над своим каноническим доменом. Вместо того, чтобы просто указывать www.theirdomain.com и theirdomain.com на мой IP-адрес сервера, они хотят направлять к ним трафик и позволять своему устройству Big-IP отправлять этот трафик нам на client.mydomain.com. Я не знаю Big-IP, но подозреваю / предполагаю, что это переписывание, и пользователь увидит только theirdomain.com.

Кроме того, у клиента есть 2 поддомена, целевые страницы которых будут обслуживаться моим приложением, и их команда по информационной безопасности не хочет иметь с ними ничего общего. Они просто обновляют DNS для этих доменов, чтобы они указывали на мой сервер. Однако целевые страницы обслуживаются по адресу client.mydomain.com/path/to/landing/page.

Поскольку мы не хотим, чтобы конечные пользователи когда-либо видели client.mydomain.comтем не менее, мой обычный процесс перенаправления 301 на отвечающий URL, похоже, создает некоторый ненужный трафик:

  1. Мой сервер отвечает на запрос sub.theirdomain.com
  2. Вместо простого ответа на запрос мой сервер перенаправляет на www.theirdomain.com/path/to/landing/page
  3. Их Big-IP отправляет их обратно на мой сервер (тот самый, который они только что оставили), но с правильным доменом.
  4. Мой сервер отображает контент.

На шаге 2, вместо перенаправления на их устройство, могу ли я просто переписать URL-адрес на www.theirdomain.com и обслуживать контент напрямую? Также приветствуются лучшие идеи. Как я уже сказал, я не сталкивался с этим раньше и ищу варианты.

У нас есть несколько клиентов, которые настроили его таким образом, чтобы они сохраняли контроль над своим собственным DNS, поскольку у некоторых из них есть только субдомены, которые указывают на нас. Мы используем nginx в качестве балансировщика нагрузки, который также обрабатывает перенаправления, и у нас есть перенаправления в файле vhost по умолчанию (00default). Ничего особенного, у нас это работает хорошо:

if ($host ~* "^ourdomain.com$") {
  rewrite ^(.*)$ http://www.ourdomain.com$1 permanent;
}

if ($host ~* "^subdomain.otherdomain.com$") {
  rewrite ^(.*)$ https://ourdomain.com$1 permanent;
}

if ($uri !~* (/option/.*|/simple/.*|/embed/.*|/mini/.*|/someOtherOption\.action.*|/otherOption\.action.*|/file/[0-9a-zA-Z]+/html5.*|/file/[0-9a-zA-Z]+/html5mobile.*|/thumbnail/.*) ) {
  set $cname_match "N";
}

if ($host !~* "(.*\.)?ourdomain\.com|videos\.yetanotherdomain\.com") {
  set $cname_match "${cname_match}N";
}
if ($cname_match = "NN") { rewrite ^.*$ http://www.ourdomain.com/; }

if ($uri !~* (/thumbnail_.*|/vcomments/.*|/onethmb.gif$|/crossdomain.xml$|/otherthmb[0-9]+.gif$)) {
  set $thumb_redirect "Y";
}
    if ($host ~* "^(cdn-)?thumbs\.ourdomain\.com") {
      set $thumb_redirect "${thumb_redirect}Y";
    }
    if ($thumb_redirect = "YY") { rewrite ^.*$ http://www.ourdomain.com/ permanent; }

 location / {
   proxy_pass      http://ourdomain_apache_pool;
   error_page 404 @fallback404;
   error_page 403 @fallback403;
 }
 # redirects
 location /learn-more {
   rewrite /learn-more/? http://www.ourdomain.com/features permanent;
 }
 # help
 location ~* ^/help/zendesk/*.*$ {
   proxy_pass      http://ourdomain_ruby_pool;   
 }
 location ~* ^/help/*.* {
   rewrite ^/(.*) http://support.ourdomain.com permanent;
 }

Мне кажется, что вы можете взять одно из приведенных выше правил перезаписи, например:

if ($host ~* "^subdomain.otherdomain.com$") {
  rewrite ^(.*)$ https://ourdomain.com$1 permanent;
}

и просто попросите их указать DNS на свой домен на вашем сервере, а затем перепишите его по своему усмотрению.