Nginx: сопоставить поддомен с подкаталогом на прокси-сервере

У меня есть домен example.com и субдомен blog.example.com . У меня есть приложение Unicorn, работающее на localhost: 5000 , и я использую Nginx в качестве обратного прокси.

У меня не было проблем при запуске только example.com . Однако я хочу добавить поддержку поддоменов, и у меня есть некоторые проблемы.

У меня есть контент на example.com/blog . Я хочу, чтобы blog.example.com указывал на него, без ведома пользователя, что используется перезапись. Я хочу сопоставить все URL-адреса, чтобы:

  • blog.example.com -> localhost: 5000 / blog
  • blog.example.com/index.php -> ] localhost: 5000 / blog / index.php
  • blog.example.com/foo/bar -> localhost: 5000 / blog / foo / bar

Моя лучшая попытка до сих пор это:

server
{
  listen 80;
  server_name blog.example.com;

  location / {
    proxy_pass http://localhost:5000/blog/$uri;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_redirect off;
  }

  client_max_body_size 4G;
  keepalive_timeout 10;
}

Это правильно переписывает blog.example.com , но не работает с blog.example.com/index.php :

$ curl -v 'http://blog.example.com'
> GET /index.php HTTP/1.1
> Host: blog.example.com
> User-Agent: curl/7.51.0
> Accept: */*
> 
< HTTP/1.1 301 Moved Permanently
< Date: Sun, 26 Mar 2017 12:29:00 GMT
< Content-Type: text/html; charset=iso-8859-1
< Content-Length: 337
< Connection: keep-alive
< Location: http://blog.example.com/blog/index.php
1
задан 26 March 2017 в 15:39
1 ответ

Я обнаружил, что моя ошибка была в этой строке:

proxy_pass http://localhost:5000/blog/$uri;

При изменении на

proxy_pass http://localhost:5000/blog$uri;

прокси работает должным образом.

[править]

Еще лучшая версия, чтобы также передавать строку запроса:

proxy_pass http://localhost:5000/blog$uri$is_args$args;
3
ответ дан 3 December 2019 в 18:30

Теги

Похожие вопросы