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


66

经过多个小时的nginx服务robots.txt(例如:提示:每次清除浏览器缓存),我结束了两种不同的方式,一种使用别名指令,另一种使用root指令,如下所示:

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

两者之间有功能上的区别吗?还是安全问题?与其他指令有冲突吗?(在另一个/ static位置,两者看起来都不错)。还是有任何理由选择另一个?

注-我没有使用这两个在同一时间 :)而我想每一个,一次一个,两者的工作。我不是在问他们如何在同一个文件中一起交互,而是要使用哪个更好。

Answers:


71

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


好点,谢谢。但是您可以=在两种情况下都使用,对吗?还是仅适用于root?另外,请参阅我的编辑-我不是要一次使用两者。:)
独眼巨人

@Cyclops是的,=在两种情况下都可以使用。
亚历山大·阿扎罗夫

因此它们是相同的-是否有任何理由选择一个指令而不是另一个指令?是我的主要问题。
独眼巨人

@Cyclops基本上没有这样的原因。
Alex

41

是的,有一个区别:使用“别名”,您可以..好别名到另一个文件名,例如

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

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

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

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

1

我认为值得明确指出nginx是对前缀而不是文件本身进行操作。在第一种情况下,

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

nginx将URL路径中的字符串前缀 替换为,然后将结果用作文件系统路径。表示为伪代码,将类似于:/robots.txt/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相当于 /home/www/static/robots.txt

当然,伪代码并不能完全说明问题,例如,nginx不会盲目使用如的原始URL路径/../../../etc/passwd,该try_files伪指令会更改root/ 的行为alias,并且在何处alias可以使用。


0

当别名用于整个目录时,会有区别。

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

会工作,而

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

不会的 这必须是

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

(容易混淆)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.