nginx try_files 将 .html 重写为“干净”的 URL

nginx try_files 将 .html 重写为“干净”的 URL

这是包含静态 html 文件的目录

public
|-- index.html
|-- media
|   `-- blurred_image-8.jpg
|-- post
|   `-- 13considerations
|       `-- index.html

我正在尝试配置 nginx 来转换所有以 结尾的 URL,以.html删除后缀。

像这样:-

server {
    listen       80;
    server_name  mysite.com;

    location / {
        root   /var/www/mysite/public;
        try_files  $uri  $uri/ $uri/index.html;
    }

    location /media/ {
        alias /var/www/mysite/public/media/;
        error_page 404 = /404;
        expires 30d;
    }

    location /static/ {
        alias /var/www/mysite/public/static/;
        error_page 404 = /404;
        expires 30d;
    }
}

这对于主页来说很有效“http://mysite.com/“但如果我尝试访问”http://mysite.com/post/13considerations/“,我收到 500 内部服务器错误。

是什么赋予了?

答案1

您使用的示例适用于返回目录文件的内容index.html,但不适用于文件(例如,http://server/somedir/file不会返回的内容/somedir/file.html)。

简化的配置,将返回任何不带扩展名的 HTML 文件将用于index.html目录如下:

server {
    listen       80;
    server_name  mysite.com;

    index index.html;
    root /var/www/mysite/public;

    location / { 
        try_files $uri $uri/ @htmlext;
    }   

    location ~ \.html$ {
        try_files $uri =404;
    }   

    location @htmlext {
        rewrite ^(.*)$ $1.html last;
    }   
}

怎么运行的:

  • index index.html当访问目录 URI 时,指定将默认使用此文件。
  • 放置rootlocation块之外将适用于整个服务器。
  • try_files $uri $uri/ @htmlext将首先寻找文件或目录的完全匹配,然后才最终尝试附加.html
  • try_files $uri =404是为了防止 Nginx 在找不到文件时陷入重写循环。
  • rewrite ^(.*)$ $1.html last附加.html并重新启动 URI 匹配过程。

相关内容