为什么我的Nginx别名不起作用?


10

我正在尝试设置一个别名,以便当有人访问时/phpmyadmin/,nginx将从而/home/phpmyadmin/不是通常的文档根目录中提取它。但是,每次我拉出URL时,它都会为所有未通过fastcgi拉出的项目提供404。fastcgi似乎工作正常,而其余的则不能。strace告诉我它正在尝试从普通文档的根目录中提取其他所有内容,但我不知道为什么。谁能提供一些见识?

这是我的配置的相关部分:

            location ~ ^/phpmyadmin/(.+\.php)$
            {
                    include fcgi.conf;
                    fastcgi_index index.php;
                    fastcgi_pass  unix:/tmp/php-cgi.sock;
                    fastcgi_param SCRIPT_FILENAME /home$fastcgi_script_name;
            }

            location /phpmyadmin
            {
                    alias /home/phpmyadmin/;
            }

作为nginx的长期Apache用户,我发现这真的很奇怪,不必要地复杂。我花了几个小时浏览文档,以试图理解原因。有人可以解释一下这种行为吗?别名应该只是位置别名。
tu-Restate Monica-dor duh 2014年

据我了解,别名是“只是”,但请注意,如果你省略后面/的别名location指令,请求/phpmyadminfile实际上得到你/home/phpmyadminfile。至于为什么问题中的配置不起作用,在我看来它是正确的,所以我怀疑还有另一个location未显示的指令,该指令在不需要时匹配。在这种情况下,作为前缀的alias结尾locationnginx文档建议使用root /home;代替
斯科特·史蒂文斯

Answers:


12

想通了一种方法。我不确定这是否是最好的,但现在肯定可以使用。

这是我所做的:

        location ~ ^/phpmyadmin/(.*)$
        {
                alias /home/phpmyadmin/$1;
        }

2

我不确定,但是您是否尝试过以这种方式编写它:

location /phpmyadmin/
        {
                alias /home/phpmyadmin/;
        }

另外,您尝试从中访问的URI是什么?

据我了解,您必须使用URI

/home/phpmyadmin/

而不仅仅是

/phpmyadmin/

您可以在此处了解更多信息:http : //wiki.nginx.org/HttpCoreModule


至少谢谢您的回答。但是,是的。我已经尝试过了。一样。
罗布

也许您必须将别名添加到其他位置。:你可以有比较你的配置到那些serverfault.com/questions/223028/...
黑色像素

1

尝试

location ^~ /phpMyAdmin/
{
    alias /home/phpmyadmin/;

    location ~ \.php$
    {
        include fcgi.conf;
        fastcgi_index index.php;
        fastcgi_pass  unix:/tmp/php-cgi.sock;
        fastcgi_param SCRIPT_FILENAME /home$fastcgi_script_name;
    }
}

1

这不起作用的原因是服务器选择基于正则表达式的位置,而不是其中具有别名的基于前缀的位置。

它只会选择一个。有一个运算符,您可以使用它来获取基于前缀的位置,以使其胜过正则表达式,但是您会发现php无法正常工作。该解决方案将像kervin的回答那样,其中PHP regex使用别名指令嵌套在该位置内。

但我怀疑他的SCRIPT_FILENAME设置可能无法在此处使用,因为URL和别名目录上的大写字母不同。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.