nginx静态索引重定向

Ade*_*Ade 6 redirect nginx http-status-code-301

这看起来很荒谬但我在一个多小时的搜索中找不到合适的答案.

我有一个静态网站运行nginx(恰好在Varnish后面).调用索引文件index.html.我想将实际访问该URL的任何人重定向mydomain.com/index.htmlmydomain.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;
}
Run Code Online (Sandbox Code Playgroud)

http://www.mydomain.com/index.html按照预期的方式响应一个301位置,http://www.mydomain.com/但不幸的是http://www.mydomain.com/也回复301自身,所以我们得到一个重定向循环.

如果index.html确实在请求中,我怎么能告诉nginx只提供301?

Chu*_* Ma 6

添加新的位置块以处理您的主页,并使用try_files指令(而不是"index index.html;")直接查找index.html文件.请注意,try_files要求您输入至少2个选项.所以我把同一个文件放两次.

location = / {
  root   /usr/share/nginx/www.mydomain.com/public;
  try_files /index.html /index.html;
}
Run Code Online (Sandbox Code Playgroud)

根据我的实验看起来不错:

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
Run Code Online (Sandbox Code Playgroud)

[ UPDATE ]重定向循环的根本原因是'index'指令,它触发nginx再次进行另一轮位置匹配.这就是位置块外部的重写规则再次执行的原因,从而导致循环.所以'index'指令就像是"重写......最后"; 指示.在你的情况下,你不希望这样.

诀窍是不再触发另一个位置匹配.try_files可以有效地做到这一点.这就是我在原来的答案中选择它的原因.但是,如果您愿意,另一个简单的解决方法是替换

  index index.html;
Run Code Online (Sandbox Code Playgroud)

通过

  rewrite ^/$ /index.html break;
Run Code Online (Sandbox Code Playgroud)

在您原来的"位置/"区块内.这'重写......休息;' 指令将使nginx保持在同一位置块内,有效地停止循环.但是,这种方法的副作用是你失去了'index'指令提供的功能.

[ 更新2 ]

实际上,index指令在重写指令之后执行.所以以下也有效.请注意,我刚刚添加了重写... break; 线.如果请求uri是"/",则nginx首先从重写规则中找到现有文件/index.html.因此,永远不会为此请求触发index指令.因此,两个指令可以一起工作.

  location / {
    root   /usr/share/nginx/www.mydomain.com/public;
    index index.html;
    rewrite ^/$ /index.html break;
  }
Run Code Online (Sandbox Code Playgroud)