这似乎可笑,但我还没有在搜索的一个小时找到了工作答案英寸
我有一个静态的网站流失的nginx(这恰好是背后清漆)。 索引文件名为index.html
。 我想重定向人究竟是谁访问的URL mydomain.com/index.html
回mydomain.com
。
这里是我的网站nginx的配置:
server {
listen 8080;
server_name www.mydomain.com;
port_in_redirect off;
location / {
root /usr/share/nginx/www.mydomain.com/public;
index index.html;
}
rewrite /index.html http://www.mydomain.com/ permanent;
}
http://www.mydomain.com/index.html
与一个预期的响应301
与位置http://www.mydomain.com/
可惜http://www.mydomain.com/
还供应301回本身这样我们就得到一个重定向循环。
我怎么能告诉nginx的只服务于301,如果index.html的是字面上的要求吗?
添加一个新的位置,块来处理您的主页,并使用try_files指令(而不是“指数的index.html;”)来直接查找index.html文件。 需要注意的是try_files要求您输入至少2种选择。 所以,我把同样的文件两次。
location = / {
root /usr/share/nginx/www.mydomain.com/public;
try_files /index.html /index.html;
}
根据我的实验看起来不错:
curl -iL http://www.mydomain.com/index.html
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Sat, 16 Mar 2013 09:07:27 GMT
Content-Type: text/html
Content-Length: 178
Connection: keep-alive
Location: http://www.mydomain.com/
HTTP/1.1 200 OK
Server: nginx
Date: Sat, 16 Mar 2013 09:07:27 GMT
Content-Type: text/html
Content-Length: 4
Last-Modified: Sat, 16 Mar 2013 08:05:47 GMT
Connection: keep-alive
Accept-Ranges: bytes
[UPDATE]的重定向循环的根本原因是“索引”指令,其触发的nginx再做另一轮的位置匹配的。 那怎么定位块之外的重写规则被再次执行,造成循环。 所以,“指数”指令就像是一个“改写......最后,” 指示。 你不希望你的情况。
诀窍是不是再次触发其他位置匹配。 try_files可以做到事半功倍。 这就是为什么我在我原来的答复捡走。 但是,如果你喜欢,另一个简单的解决方法是更换
index index.html;
通过
rewrite ^/$ /index.html break;
里面原来的“位置/”块。 这种“改写......打破;” 指令将保持nginx的入住同一位置块内,有效地停止循环。 但是,这种方法的副作用是,你不可能像“指数”指令提供的功能。
[UPDATE 2]
事实上,指数指令改写指令后执行。 所以下面也适用。 请注意,我只是说了重写...突破; 线。 如果请求URI是“/”,nginx的发现从重写规则第一现有文件/index.html。 因此指数指令从未被触发此请求。 其结果是,两个指令都可以一起工作。
location / {
root /usr/share/nginx/www.mydomain.com/public;
index index.html;
rewrite ^/$ /index.html break;
}
看来你真的不想要index.php
在地址栏中显示的,是正确的?
如果添加了改写指令,nginx的配置,你会得到一个重定向循环,因为你都经历过。 如果你是开放的一个JavaScript的解决方案,你可以在任何地方放置这个index.html
默默改写地址栏:
<script>
history.pushState(null, '', '/');
</script>
欲获得更多信息
请记住,虽然大部分现代浏览器支持history
API,不是所有的事(即大多数版本的IE)。