我终其一生都无法弄清楚如何为地点创建别名。
基本上,我的服务器上有/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
。我做错了什么?我真的很困惑root
、location
和之间的关系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;
}