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

这里是包含静态HTML文件的目录

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

我正在尝试configurationnginx来转换所有以.html结尾的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内部服务器错误。

是什么赋予了?

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

一个简单的configuration,它将返回任何不带扩展名的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; } } 

怎么运行的:

  • 当目录URI被访问时,指定index index.html将默认使用这个文件。
  • root放在location块之外将应用于服务器范围。
  • try_files $uri $uri/ @htmlext将在最后尝试添加.html之前先查找文件或目录的完全匹配。
  • try_files $uri =404是为了防止Nginx陷入重写循环中,如果找不到文件。
  • rewrite ^(.*)$ $1.html last附加.html并重新启动URI匹配过程。