nginx 为 webapp 提供了 url 的“位置”部分

nginx 为 webapp 提供了 url 的“位置”部分

我正在运行 nginx 0.8.44,并且有两个 uwsgi (0.9.5.4) 实例。一个用于我的 Django 网站,另一个运行 Trac。

我将 Django 设置为location / { ... },Trac 为location /trac { ... } 但是当我转到 时http://mysite/trac,它会为 Trac 提供 URL 的 /trac 部分。所以我基本上得到了 404,因为 Trac 正在其根目录下寻找 URL,即 /trac。它转到的页面显示

Error: Not Found
No handler matched request to /trac

而且 CSS 样式表在该页面上不起作用。但 Trac 的典型部分仍然存在,例如“查看票证”和“Wiki”链接。

但是,如果我将 Trac 的位置更改为 /,它就可以正常工作。nginx 或 uwsgi 中是否有某种方法可以不将 URL 的“位置”部分发送给应用程序?如果 Django 的位置不是 /,也会发生这种情况。

我之前使用过带有 mod_wsgi 的 Apache,它能够轻松完成此操作。

答案1

对于那些寻找的人来说,

使用 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;
}

答案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;
       }
   }

相关内容