我已经看到了一些重写$request_uri
方法,并在文件系统中存在特定文件时向其添加index.html
,如下所示:
if (-f $request_filename/index.html) { rewrite (.*) $1/index.html break; }
但我想知道如果相反是可以实现的:
即当有人请求http://example.com/index.html
,他们被redirect到http://example.com
因为Nginx的正则expression式是perl兼容的,我尝试了这样的事情:
if ( $request_uri ~* "index\.html$" ) { set $new_uri $request_uri ~* s/index\.html// rewrite $1 permanent; }
但它主要是一个猜测,是否有任何好的文档描述nginx modrewrite?
我在顶级服务器子句中使用以下重写:
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错误。
我不知道为什么第一次重写是不够的。
以下配置允许我将/index.html
重定向到/
和/subdir/index.html
到/subdir/
:
# Strip "index.html" (for canonicalization) if ( $request_uri ~ "/index.html" ) { rewrite ^(.*)/ $1/ permanent; }
对于root /index.html
的回答导致了一个重定向循环,所以我不得不搜索其他答案。
这个问题在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/; }
出于某种原因,这里提到的大多数解决方案都不起作用。 那些工作给了我缺少/在网址中的错误。 这个解决方案适用于我。
粘贴您的位置指令。
if ( $request_uri ~ "/index.html" ) { rewrite ^/(.*)/ /$1 permanent; }
这对我有用:
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;
这个工作:
# redirect dumb search engines location /index.html { if ($request_uri = /index.html) { rewrite ^ http://$host? permanent; } }
引用$scheme://domain.com/
的解决$scheme://domain.com/
假定该域是硬编码的。 这不是我的情况,所以我用:
location / { ... rewrite index.html $scheme://$http_host/ redirect; ... }