您为 Apache 发布的代码段使用不可变的全局变量%{THE_REQUEST}
来确定客户端请求的原始 URI。但是,此变量包含整个请求,包括 HTTP 方法、版本和查询字符串。因此,解析此变量有点混乱,如您发布的示例所示。
但是,nginx
有一个专用变量来保存从客户端收到的原始请求 URI:$request_uri
. 这允许您执行以下操作:
## REDIRECT foo/index(.html) to foo/
if ($request_uri ~ ^(.*/)index(?:\.html)?$) {
return 301 $1;
}
如果您还想去除文件后缀,例如.html
,您可以使用以下代码段:
## REDIRECT foo/bar.html to foo/bar
if ($request_uri ~ ^(.+)\.html$) {
return 301 $1;
}
现在,为了nginx
仍然能够提供正确的文件,使用该try_files
指令,该指令依次检查所有给定的 URI,直到匹配:
## Rewrite internal requests for foo/bar to foo/bar.html
try_files $uri $uri.html =404;
因此,请求/foo/bar
将按如下方式处理:
- return
$uri
= /foo/bar
,如果该文件存在于文档根目录中,否则
- return
$uri.html
=/foo/bar.html
如果存在,最后
- 发出 404 错误。