如何在nginx中为目录别名?

ffx*_*sam 6 nginx

我一生都无法弄清楚如何为位置制作别名。

基本上,/var/www我的服务器上可以包含任意数量的文件夹(用于不同的应用程序)。其中之一是ViMbAdmin,位于/var/www/vimbadmin,以及应该提供给客户端的实际网页文件都在/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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的目标是设置它以便黑客不能只是尝试访问http://myserver.com/vimbadmin,因此实际的 URL 将是http://myserver.com/mail2admin. 我究竟做错了什么?我真的感到困惑之间的关系rootlocation以及alias

Car*_*cer 6

location 指令与请求中的 uri 匹配。root 指令和 alias 指令都用于指示从文件系统中的哪个位置提供资源,区别在于使用 时root,整个 URI 仍然附加到根;而在使用时alias,位置部分被删除。请参阅/sf/ask/744235341/的答案

所以在你的情况下,你想要的可能看起来像:

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;
}
Run Code Online (Sandbox Code Playgroud)

... }

这可以防止任何人访问 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(如果您只使用自己,则使用自签名,或者如果您希望在一般情况下其他人的浏览器信任它,现在可以使用 LetsEncrypt.org 免费轻松实现)。


EEA*_*EAA 0

这应该可以做到:

location ~ ^/foo/.* {
            root /path/to/foo;
}
Run Code Online (Sandbox Code Playgroud)