我已经看到了一些方法来重写$request_uri
并在文件系统中存在特定文件时添加index.html
,如下所示:
if (-f $request_filename/index.html) {
rewrite (.*) $1/index.html break;
}
但我想知道相反是否可以实现:
即。当某人请求http://example.com/index.html
时,他们会被重定向到http://example.com
因为nginx正则表达式与perl兼容,所以我试过这样的事情:
if ( $request_uri ~* "index\.html$" ) {
set $new_uri $request_uri ~* s/index\.html//
rewrite $1 permanent;
}
但这主要是猜测,有没有很好的文档描述nginx的modrewrite?
答案 0 :(得分:7)
我在顶级服务器子句中使用以下重写:
rewrite ^(.*)/index.html$ $1 permanent;
单独使用此功能适用于大多数网址,例如http://foo.com/bar/index.html
,但它会中断http://foo.com/index.html
。要解决此问题,我有以下附加规则:
location = /index.html {
rewrite ^ / permanent;
try_files /index.html =404;
}
=404
部分在找不到文件时返回404错误。
我不知道为什么单独的第一次重写是不够的。
答案 1 :(得分:2)
以下配置允许我将/index.html
重定向到/
,将/subdir/index.html
重定向到/subdir/
:
# Strip "index.html" (for canonicalization)
if ( $request_uri ~ "/index.html" ) {
rewrite ^(.*)/ $1/ permanent;
}
答案 2 :(得分:1)
对于根/index.html
,Nicolas的回答导致了重定向循环,因此我不得不搜索其他答案。
这个问题是在nginx论坛上提出的,答案效果更好。 http://forum.nginx.org/read.php?2,217899,217915
使用
location = / {
try_files /index.html =404;
}
location = /index.html {
internal;
error_page 404 =301 $scheme://domain.com/;
}
或
location = / {
index index.html;
}
location = /index.html {
internal;
error_page 404 =301 $scheme://domain.com/;
}
答案 3 :(得分:1)
这个有效:
# redirect dumb search engines
location /index.html {
if ($request_uri = /index.html) {
rewrite ^ $scheme://$host? permanent;
}
}
答案 4 :(得分:1)
出于某些原因,这里提到的大多数解决方案都不起作用。工作的那些给了我错误/在网址中丢失/。这个解决方案适合我。
粘贴到您的位置指令。
if ( $request_uri ~ "/index.html" ) {
rewrite ^/(.*)/ /$1 permanent;
}
答案 5 :(得分:1)
这对我有用:
rewrite ^(|/(.*))/index\.html$ /$2 permanent;
它涵盖了根实例/index.html
和较低实例/bar/index.html
正则表达式的第一部分基本上翻译为:[nothing]
或/[something]
- 在第一种情况下,$ 2是空字符串,因此您重定向到/
,在第二种情况下$ 2是[something]
,因此您重定向到/[something]
我实际上更喜欢涵盖index.html
,index.htm
和index.php
rewrite ^(|/(.*))/index\.(html?|php)$ /$2 permanent;
答案 6 :(得分:0)
引用$scheme://domain.com/
的解决方案假设域是硬编码的。这不是我的情况所以我用过:
location / {
...
rewrite index.html $scheme://$http_host/ redirect;
... }