如何在 nginx 中为目录添加别名?

如何在 nginx 中为目录添加别名?

我终其一生都无法弄清楚如何为地点创建别名。

基本上,我的服务器上有/var/www,其中可能包含任意数量的文件夹(用于不同的应用程序)。其中一个是 ViMbAdmin,位于/var/www/vimbadmin,而应该提供给客户端的实际 Web 文件位于/var/www/vimbadmin/public。以下是我目前遇到的问题,但失败了:

server {
    listen      80;
    server_name myserver.com;
    root        /var/www;

    index index.php;

    # Logs
    access_log  /var/log/nginx/vimbadmin.access.log;
    error_log   /var/log/nginx/vimbadmin.error.log;

    location /vimbadmin/public {
        try_files $uri $uri/ /index.php?$args;
    }

    location /mail2admin {
      alias /vimbadmin/public;
    }

    # Pass the PHP scripts to FastCGI server
    location ~ \.php$ {
        # Prevent Zero-day exploit
        try_files $uri =404;

        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

        fastcgi_pass    unix:/var/run/php5-fpm.sock;
        fastcgi_index   index.php;
        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include         fastcgi_params;
    }
}

我的目标是设置它,以便黑客无法尝试访问http://myserver.com/vimbadmin,因此实际 URL 将是http://myserver.com/mail2admin。我做错了什么?我真的很困惑rootlocation和之间的关系alias

答案1

location 指令与请求中的 uri 匹配。root 指令和 alias 指令都用于指示文件系统中提供资源的位置,不同之处在于,使用 时root,整个 URI 仍附加到根目录;而使用 时alias,location 部分将被删除。请参阅答案https://stackoverflow.com/questions/10631933/nginx-static-file-serving-confusion-with-root-alias

因此,就您而言,您想要的可能是这样的:

server {

    listen      80;
    server_name myserver.com;
    root        /var/www;

    index index.php;

    ...

    location /vimbadmin/ {
       return 404;
    }

    location /mail2admin/ {
      alias /var/www/vimbadmin/public;
      try_files $uri $uri/ /index.php?$args;
    }

    ...
}

这可以防止任何人访问 myserver.com/vimbadmin/,但如果他们访问 myserver.com/mail2admin/,nginx 将映射到/var/www/vimbadmin/public(如果您使用root /var/www/vimbadmin/public,nginx 将尝试从 提供文件/var/www/vimbadmin/public/mail2admin,但这不是您想要的)。

一般来说,像这样的简单的 URL 混淆不应被视为任何形式的黑客防御。如果您想保证此管理面板的安全,您应该依赖某种身份验证,并可能将其锁定,以便仅允许从批准的 IP 进行访问(如果这对您来说可行)。应用程序本身可能会提供一些用户身份验证,并且您始终可以添加基本的 http 身份验证。还建议使用 SSL(如果您只使用 SSL,则使用自签名,或者如果您希望在一般情况下受到其他人的浏览器的信任,现在可以使用 LetsEncrypt.org 免费轻松完成此操作)。

答案2

这应该可以做到:

location ~ ^/foo/.* {
            root /path/to/foo;
}

相关内容