Redirect nginx静态索引重定向

Redirect nginx静态索引重定向,redirect,nginx,http-status-code-301,Redirect,Nginx,Http Status Code 301,这似乎很可笑,但我在一个多小时的搜索中还没有找到有效的答案 我有一个运行nginx的静态网站(恰好在Varnish后面)。索引文件名为index.html。我想将实际访问URLmydomain.com/index.html的任何人重定向回mydomain.com 以下是我的网站nginx配置: server { listen 8080; server_name www.mydomain.com; port_in_redirect off; location / {

这似乎很可笑,但我在一个多小时的搜索中还没有找到有效的答案

我有一个运行nginx的静态网站(恰好在Varnish后面)。索引文件名为
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服务回自身,因此我们得到一个重定向循环

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

看起来您真的不希望
index.php
出现在地址栏中,对吗

如果您向nginx配置添加一个rewrite指令,您将得到一个重定向循环,正如您所经历的那样。如果您对javascript解决方案持开放态度,则可以将其放置在
index.html
中的任何位置,以静默方式重写地址栏:

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

history.pushState(null,,“/”);


请记住,虽然大多数现代浏览器都支持
历史
API,但并非所有浏览器都支持(即大多数IE版本)。

添加一个新的位置块来处理您的主页,并使用try_files指令(而不是“index index.html;”)直接查找index.html文件。请注意,try_文件要求您至少输入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
[更新] 重定向循环的根本原因是'index'指令,它触发nginx再次执行另一轮位置匹配。这就是位置块外的重写规则如何再次执行,从而导致循环。所以“index”指令就像“rewrite…last;”指令。你不想在你的案子里这样

诀窍是不要再次触发另一个位置匹配。try_文件可以有效地做到这一点。这就是为什么我在最初的答案中选择了它。然而,如果您愿意,另一个简单的修复方法是替换

  index index.html;

在原始“位置/”块中。这是“重写…中断;”指令将使nginx保持在同一位置块内,有效地停止循环。然而,这种方法的副作用是失去了“index”指令提供的功能

[更新2]

实际上,index指令在rewrite指令之后执行。因此,下面的方法也适用。注意,我刚刚添加了重写…中断;线路。如果请求uri为“/”,nginx首先从重写规则中查找现有文件/index.html。因此,不会为此请求触发index指令。因此,这两个指令可以一起工作

  location / {
    root   /usr/share/nginx/www.mydomain.com/public;
    index index.html;
    rewrite ^/$ /index.html break;
  }

谢谢,行得通。我真的不明白为什么会停止重定向循环,但它确实停止了<代码>试用文件可能有点神奇。你能解释一下为什么把
try_文件/index.html/index.html行到现有位置块不起作用?(我试过了)。干杯。@Ade我今晚晚些时候再解释。@Ade补充更多解释。不知道你第二次考试是怎么考的。请注意,您必须删除“index”指令才能使其正常工作。@ChuanMa非常感谢您的解释-我对nginx比较陌生,现在开始更好地理解它。谢谢大家!@Ade np。我再次更新了答案。你问了一个好问题。很高兴看到它对你有用!谢谢是的,我知道有几种应用程序级别的重定向方法,但希望在服务器级别配置,因为它将在许多应用程序中重用。
  location / {
    root   /usr/share/nginx/www.mydomain.com/public;
    index index.html;
    rewrite ^/$ /index.html break;
  }