我正在使用静态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;
}
答案 0 :(得分:1)
为什么在某个位置不需要时添加尾部斜杠这么难?斜杠/无斜杠有助于区分文件与文件系统上的目录。这样可以避免您使用try_files
,手动搜索$1
或$1/
...
location ~* ^(.+?)/$ {
try_files $1.html $1 $1/index.html $1/ =404;
}
应该这样做。
注意我使用了非贪婪的*
量词来避免捕获尾随斜线。
我避免使用(.*?)
来保持清洁,虽然它会有相同的效果,因为虽然理论上匹配/
位置特殊情况,但你有location = /
可以匹配它并停止搜索(感谢=
修饰符)。
小心堆栈的正则表达式位置:订单很重要,这使得维护变得困难...尽量将它们包含在前缀位置中。