nginx正则表达式用于带有尾部斜杠的静态html文件

时间:2014-11-05 21:02:43

标签: regex nginx

我正在使用静态html并希望强制使用尾部斜杠。在没有斜线的情况下重定向很好,但是提供实际的html文件很棘手。这个正则表达式不是

location ~* ^(.*)[^/]/$ {
    try_files $1.html $1 $1/index.html $1/ =404;
}

所以应该make / work / load /work.html,/ work或/work/index.html但它只是404。

我还有其他一些重定向,但这里有一个简介:

/people.html应重定向到/ people /但服务器文件/people.html

这是我的完整服务器块:

server {
    listen 80;

    root /vagrant/www;
    index index.html index.htm;

    server_name localhost;

    rewrite ^(.*[^/])$ $1/ permanent;

    if ($request_method !~ ^(GET|HEAD)$ ) {
        return 444;
    }

    location = / {
        try_files /index.html =404;
    }

    location = /index {
        return 301 $scheme://$host;
    }

    location ~* \.html$ {
        rewrite ^(.+)\.html$ $scheme://$host$1 permanent;
    }

    location ~* ^(.*)[^/]/$ {
        try_files $1.html $1 $1/index.html $1/ =404;
    }

    location / {
        try_files $uri.html $uri $uri/index.html $uri/ =404;
    }

    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;

    include h5bp/basic.conf;
}

1 个答案:

答案 0 :(得分:1)

为什么在某个位置不需要时添加尾部斜杠这么难?斜杠/无斜杠有助于区分文件与文件系统上的目录。这样可以避免您使用try_files,手动搜索$1$1/ ...

location ~* ^(.+?)/$ {
    try_files $1.html $1 $1/index.html $1/ =404;
}

应该这样做。

注意我使用了非贪婪的*量词来避免捕获尾随斜线。

我避免使用(.*?)来保持清洁,虽然它会有相同的效果,因为虽然理论上匹配/位置特殊情况,但你有location = /可以匹配它并停止搜索(感谢=修饰符)。

小心堆栈的正则表达式位置:订单很重要,这使得维护变得困难...尽量将它们包含在前缀位置中。