2

可能不太相关,但我将从我的环境开始:Linux OS、Perl 5.10、Catalyst 5.80032、nginx 1.0.11。

为了这个问题,假设我在端口 80 上使用mydomain.com作为应用程序网页的访问点。还让我们/var/www/mydomain用作我的 Catalyst 应用程序的物理位置。在这种情况下,静态内容位于/var/www/mydomain/MyApp/root/.

我将应用程序作为 fastcgi 服务器启动(来自MyApp/script):

    > ./myapp_fastcgi.pl -l /tmp/myapp.socket -n 2 -p /tmp/myapp.pid -d

我使用以下配置启动nginx服务器:

    server {
        listen       127.0.0.1:80;
        server_name  mydomain.com;

        location / {
            include        fastcgi_params;
            fastcgi_param  PATH_INFO  $fastcgi_script_name;
            fastcgi_pass   unix:/tmp/myapp.socket;
        }

        location /static {
            root   /var/www/mydomain/MyApp/root;
        }
    }

http://mydomain.com/当我以或http://mydomain.com/products作为另一个页面(由 处理)访问应用程序时,一切似乎都正常MyApp::Controller::Products

现在是挑战和问题:应该如何配置nginx以便它可以为具有 URI 前缀(例如/some/prefix的应用程序页面提供服务?

在这种情况下,rootpage 应该以 ashttp://mydomain.com/some/prefix/和第二个 as访问http://mydomain.com/some/prefix/products

问题的第二部分是:应如何修改应用程序代码以便为重定向和所有页面提供有效的 URI?$c->uri_for()应该如何(重新)编写类似的方法以使前缀路径具有相同的行为?

我试过虚拟直接调整

    location /some/prefix {
        include        fastcgi_params;
        fastcgi_param  PATH_INFO  $fastcgi_script_name;
        fastcgi_pass   unix:/tmp/myapp.socket;
    }

但当然它不是这样工作的。因此,在转向 Perl 代码并使用重定向和 URL 生成之前,即使手动输入 URL,我也无法获得响应。

4

1 回答 1

0

nginx这样的指令中有alias. 它是这样工作的:

如果您有一个值为 的 urlhttp://my.domain.com/some/prefix/blabla.file并使用alias带有指令的location指令,如下所示:

location /some/prefix {
   alias /var/www/mydomain/MyApp/root;
}

结果 url 将是/var/www/mydomain/MyApp/blabla.file. 为什么?因为块alias中的指令location使用它的值(alias值)作为临时root服务文件和请求并从匹配的请求部分修剪location所以当请求在/some/prefix/blabla.file这里时,只有/blabla.file当你将它添加到alias值时,你才会得到你想要的(如果我很好理解你)。

根据我们在评论中的讨论,亲爱的,我可以提出两件事。首先,在 nginx 中你可以添加这样的location块:

location ~ ^/some/prefix(.*)$ {
   rewrite ^/some/prefix(.*)$ $1;
}

该指令将从中删除/some/prefix/some/prefix/products只留下/products. 接下来将您的location块更改为如下所示:

location / {
    include        fastcgi_params;

    # Here you provide for your Catalys real uri which was orignally provided by user
    fastcgi_param  REQUEST_URI $request_uri;

    fastcgi_param  PATH_INFO  $fastcgi_script_name;
    fastcgi_pass   unix:/tmp/myapp.socket;
}    

因此,您将REQUEST_URICatalys 的参数设置为具有用户请求的价值而无需任何修改。在nginx是变量$request_uri$uri。第一个的值永远不会改变,而第二个的值每次都会改变,例如,被rewrite指令重写。此外,这将起作用,因为location ~它具有更高的优先级,location /因此请求 url 将始终首先被修剪为仅在/some/prefix模式之后出现的内容。

现在有用吗?

于 2013-01-30T20:20:26.310 回答