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/; }
(容易混淆)
评论
天哪,您清除快取的提示挽救了我的一夜。