nginx的静态指标重定向(nginx static index redirect)

2019-08-17 18:12发布

这似乎可笑,但我还没有在搜索的一个小时找到了工作答案英寸

我有一个静态的网站流失的nginx(这恰好是背后清漆)。 索引文件名为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;
}

http://www.mydomain.com/index.html与一个预期的响应301与位置http://www.mydomain.com/可惜http://www.mydomain.com/还供应301回本身这样我们就得到一个重定向循环。

我怎么能告诉nginx的只服务于301,如果index.html的是字面上的要求吗?

Answer 1:

添加一个新的位置,块来处理您的主页,并使用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;
  }


Answer 2:

看来你真的不想要index.php在地址栏中显示的,是正确的?

如果添加了改写指令,nginx的配置,你会得到一个重定向循环,因为你都经历过。 如果你是开放的一个JavaScript的解决方案,你可以在任何地方放置这个index.html默默改写地址栏:

<script>
    history.pushState(null, '', '/');
</script>

欲获得更多信息

请记住,虽然大部分现代浏览器支持history API,不是所有的事(即大多数版本的IE)。



文章来源: nginx static index redirect