Redirect nginx静态索引重定向
这似乎很可笑,但我在一个多小时的搜索中还没有找到有效的答案 我有一个运行nginx的静态网站(恰好在Varnish后面)。索引文件名为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 / {
index.html
。我想将实际访问URLmydomain.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;
}