经过许多小时,让nginx可以提供单个文件(例如robots.txt)(提示:每次清除浏览器缓存),然后我用两种不同的方法结束,一种使用别名指令,一种使用root指令,如下所示:

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/; }与您的第一个指令完全相同。

评论


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

–独眼巨人
2011-6-8 17:20



@Cyclops是的,在两种情况下都可以使用=。

–亚历山大·阿扎罗夫(Alexander Azarov)
2011年6月9日上午7:52

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

–独眼巨人
2011年6月9日在13:36

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

– Alex
2011年6月9日14:05

#2 楼

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

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; }


#3 楼

我认为值得明确指出nginx是对前缀而不是文件本身进行操作。在第一种情况下,nginx将URL路径中的字符串前缀/robots.txt替换为/home/www/static/robots.txt,然后将结果用作文件系统路径。用伪代码表示,它类似于:

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


所以/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事先不知道,这全都基于字符串前缀,而不是基于字符串的前缀。

,在第二种情况下,

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


/home/www/static/在URL路径的开头,然后将结果用作文件系统路径。在伪代码中,这类似于:

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


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

当然,伪代码并不完全讲整个故事,例如nginx不会盲目使用诸如/../../../etc/passwd之类的原始URL路径,而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/; }


(容易混淆)