Nginx - 根与别名,用于提供单个文件?

Nginx - 根与别名,用于提供单个文件?

经过许多小时的nginx服务,单个文件如下robots.txt(提示:清除浏览器缓存每次),我最终采用了两种不同的方法,一种是使用别名指令,以及使用指令,如下所示:

location /robots.txt { alias /home/www/static/robots.txt; }
location /robots.txt { root /home/www/static/;  }

有没有功能两者之间有什么区别?还是安全问题?与其他指令有冲突吗?(两者似乎都适用于另一个 /static 位置)。或者有什么理由选择其中一个而不是另一个?

注意 - 我没有同时使用同时:) 我尝试了每一个,每次一个,都成功了。我不是问它们如何在同一个文件中交互,而是问哪一个更好用。

答案1

好吧,这两个指令在功能上略有不同,因为在后一种情况下您不使用精确匹配。因此,/robots.txt1111也会匹配您的第二个位置。与
location =/robots.txt { root /home/www/static/; }您的第一个指令在功能上完全相同。

答案2

是的,有区别:使用“别名”,你可以将文件名别名为另一个文件名,例如

location /robots.txt { alias /home/www/static/any-filename.txt; }

然而

location /robots.txt { root /home/www/static/; }

强制您在服务器上将文件命名为 robots.txt。我使用第一个选项,因为我喜欢将服务器上的 robots 文件命名为 tld.domain.subdomain-robots.txt;例如

location /robots.txt { alias /home/www/static/ch.notex.static-robots.txt; }

答案3

我认为有必要明确指出,nginx 操作的是前缀,而不是文件本身。在第一种情况下,

location /robots.txt { alias /home/www/static/robots.txt; }

nginx 替换字符串字首 /robots.txt在 URL 路径中使用,/home/www/static/robots.txt然后将结果用作文件系统路径。用伪代码表示,这将是这样的:

if urlPath.startsWith("/robots.txt") {
    fsPath := "/home/www/static/robots.txt" + urlPath.stripPrefix("/robots.txt")
    serveFile(fsPath)
}

因此,/robots.txt将从 提供服务,/home/www/static/robots.txt因为/robots.txt删除前缀后/robots.txt是空字符串,而将空字符串附加到/home/www/static/robots.txt后保持不变。但是,/robots.txt1将从 提供服务/home/www/static/robots.txt1/robots.txt/foobar将从 提供服务/home/www/static/robots.txt/foobar。这些文件可能不存在,导致 nginx 发送 404 响应,而且 很可能robots.txt不是一个目录,但 nginx 事先并不知道这一点,而这一切都基于字符串前缀,而不是什么出现通过是否存在尾随斜杠来判断是文件还是目录。

而在第二种情况下,

location /robots.txt { root /home/www/static/; }

nginx 将字符串插入/home/www/static/URL 路径的开头,然后将结果用作文件系统路径。在伪代码中,这将是这样的:

if urlPath.startsWith("/robots.txt") {
    fsPath := "/home/www/static/" + urlPath
    serveFile(fsPath)
}

这与第一种情况的结果完全相同,但原因不同。没有前缀剥离,但由于每个 URI 路径都必须包含前缀/robots.txt,因此文件系统路径将始终以/home/www/static//robots.txtwhich开头相当于 /home/www/static/robots.txt

当然,伪代码并没有完全说明全部情况,例如 nginx 不会盲目地使用类似 的原始 URL 路径/../../../etc/passwd,该指令会改变/try_files的行为,并且在可以使用的位置存在限制。rootaliasalias

答案4

当别名针对整个目录时,情况就会有所不同。

    location ^~ /data/ { alias /home/www/static/data/; }

会起作用,而

    location ^~ /data/ { root /home/www/static/data/; }

不行。这必须是

    location ^~ /data/ { root /home/www/static/; }

(容易混淆)

相关内容