0

我已经配置了 nginx 别名,预期的行为是每当有https://demo-frontend.in/dl/uurl/orr时,它应该从 /var/www/frontend_react/build/ 目录获得请求。但相反,它是从默认的 /var/www/frontend/public 目录中获取的。

server {
    listen 80;
    root /var/www/frontend/public;
    index index.php index.html index.htm;
    server_name demo-frontend.in;

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

    location /dl {
        alias /var/www/frontend_react/build/;
        try_files $uri $uri/ /index.html?$args;


    }


    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.3-fpm.sock;
    }

}

4

1 回答 1

0

nginx 中的alias规则的工作原理是位置块中定义的前缀(/dl在您的情况下)被替换为参数(/var/www/frontend_react/build/在您的情况下)。

nginx 然后应用try_files参数并尝试找到合适的文件来提供服务

对于您给定的 URL,这会导致检查以下文件系统路径:

/var/www/frontend_react/build//uurl/orr
/var/www/frontend_react/build//uurl/orr/

如果在这两个位置都没有找到有效文件,nginx 会执行内部重定向到

 https://demo-frontend.in/index.html?

然后,此内部重定向与您的location /块匹配,因此从那里提供服务。

要解决此问题,您可能需要将 try_files 指令调整为:

location /dl/ {
  alias /var/www/frontend_react/build/;
  try_files $uri $uri/index.html =404;
}

有了这个,nginx首先尝试找到实际的文件

/var/www/frontend_react/build/uurl/orr

如果没有找到可服务的内容,则回退到index.html文件

/var/www/frontend_react/build/uurl/orr/index.html

如果仍然找不到该文件,则 nginx 然后返回 404 错误。

最后,请注意,在我的示例中,我在 location 块中添加了一个斜杠。在您的原始示例中,您将容易受到任意文件读取漏洞的攻击,这会导致服务器上任何位置的任何文件都可以被具有 URL 的任何人读取,例如

https://demo-frontend.in/dl../../../../etc/passwd

使用别名规则,请确保在一条或两条路径上都添加斜杠。

于 2021-03-25T14:13:43.947 回答