可能它并不那么重要,但我会从我的环境开始:Linux操作系统,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应作为http://mydomain.com/some/prefix/
访问,第二个作为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。
答案 0 :(得分:0)
在nginx
这样的指令中有alias
。它的工作原理如下:
如果您的网址的值为http://my.domain.com/some/prefix/blabla.file
,请使用alias
指令和location
指令,如下所示:
location /some/prefix {
alias /var/www/mydomain/MyApp/root;
}
生成的网址为/var/www/mydomain/MyApp/blabla.file
。为什么?因为alias
块中的location
指令使用它的值(alias
值)作为临时root
来提供服务文件,并请求和修剪来自{{{}的匹配请求部分1}}所以当请求在location
时,它只会是/some/prefix/blabla.file
,当你将其添加到/blabla.file
值时,你会得到你想要的东西(如果我理解你的话)。 / p>
根据我们在评论中的讨论,我可以提出两件事。
首先,在nginx中,您可以添加此类alias
块:
location
此指令将从location ~ ^/some/prefix(.*)$ {
rewrite ^/some/prefix(.*)$ $1;
}
中删除/some/prefix
,只留下/some/prefix/products
。接下来将您的/products
块更改为如下所示:
location
因此,您为您的Catalys设置param 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_URI
中的变量nginx
和$request_uri
。第一个的值永远不会改变,而第二个的值在每次改变时都会改变,例如,由$uri
指令重写。此外,这将有效,因为rewrite
的优先级高于location ~
,因此请求网址将始终首先仅限于location /
模式之后的内容。
现在有用吗?