经过许多小时的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.txt
which开头相当于 /home/www/static/robots.txt
。
当然,伪代码并没有完全说明全部情况,例如 nginx 不会盲目地使用类似 的原始 URL 路径/../../../etc/passwd
,该指令会改变/try_files
的行为,并且在可以使用的位置存在限制。root
alias
alias
答案4
当别名针对整个目录时,情况就会有所不同。
location ^~ /data/ { alias /home/www/static/data/; }
会起作用,而
location ^~ /data/ { root /home/www/static/data/; }
不行。这必须是
location ^~ /data/ { root /home/www/static/; }
(容易混淆)