nginx предоставляет веб-приложению часть URL-адреса

Я использую nginx 0.8.44, и у меня есть два экземпляра uwsgi (0.9.5.4). Один для моего сайта Django, другой работает под управлением Trac.

У меня есть настройки Django как location / { ... }и трак location /trac { ... }Но когда я иду в http://mysite/trac, это дает Trac часть /trac URL. Таким образом, я в основном получаю 404, потому что Trac ищет URL под своим корнем, который является /trac. Страница, на которой идет

Error: Not Found
No handler matched request to /trac

И таблицы стилей CSS не работают на этой странице. Но типичные части Trac там как ссылки "Просмотр билетов" и "Вики".

Но если я изменю местоположение Trac на /, это будет работать отлично. Есть ли какой-либо способ в nginx или uwsgi, чтобы не отправлять часть "location" url приложению? Это также происходит с Django, если его местоположение не /.

Ранее я использовал Apache с mod_wsgi, и он мог делать это без суеты.

2 ответа

Решение

Я закончил настройку поддоменов.
Так что для trac я использую trac.mydomain.com.

Я не нашел способ сделать это без поддоменов, но это может быть возможно. Это просто оказалось самым простым.

Для тех, кто читает это, вам нужно добавить любые субдомены в ваш DNS. А для конфигурации nginx вы используете что-то вроде этого:

http {

   upstream django {
       ip_hash;
       server 127.0.0.1:3030;
   }

   upstream trac {
       ip_hash;
       server 127.0.0.1:3031;
   }

   server {
      listen 80;
      server_name mydomain.com;

      location / {
          uwsgi_pass django;
          include uwsgi_params;
      }
   }

   server {
       listen 80;
       server_name trac.mydomain.com;

       location / {
           uwsgi_pass trac;
           include uwsgi_params;
       }
   }

Для тех, кто ищет,

с fastcgi (и, я полагаю, аналогичным образом для wsgi) это также можно сделать следующим образом, аналогично http://wiki.nginx.org/FcgiZope:

location /trac {
    fastcgi_pass unix:/path/to/socket;
    if ($uri ~ ^/trac/(.*)) {
        set $path_info /$1;
    }

    include fastcgi_params;
    fastcgi_param  SCRIPT_NAME        "/trac";
    fastcgi_param  PATH_INFO          $path_info;
}

; или без дополнительного if:

location ~ ^/trac(?<path_info>/.*)$ {
    fastcgi_pass unix:/path/to/socket;
    include fastcgi_params;
    fastcgi_param  SCRIPT_NAME        "/trac";
    fastcgi_param  PATH_INFO          $path_info;
}

,

Другие вопросы по тегам