配置nginx以重写所有路径上的哈希值

时间:2016-02-01 21:58:41

标签: nginx url-rewriting nginx-location

我首先使用nginx作为静态文件服务器,如果它们包含指向模拟目录的哈希值,则尝试重写所有uri。

通过示例

可能会更清楚

让我们说用户请求页面网址如:

/api/some/path/to/ecbac7cb-21ca-3d22-98ed-4d063f138d0b/some/other/path/02167621-5c01-45c5-98ba-eb3ba1bf4b2a/list

/api/some/other/path/to/ecbac7cb-21ca-3d22-98ed-4d063f138d0b

我想先尝试获取该文件,但后备将是这样的事情

/api/some/path/to/__any_hash__/some/other/path/__any_hash__/list.json

/api/some/other/path/to/__any_hash__.json

这是我尝试过的配置......但显然,它不起作用。

server {
 ...
 location /api {
  try_files $uri $uri/index.html $uri.html $uri.json $uri.xml @rewrites;
 }

 location @rewrites {
  rewrite /([0-9\-a-f]{36})/ __any_hash__ break;
  try_files $uri.xml $uri.json @backend;
 }

有人有想法吗?

1 个答案:

答案 0 :(得分:1)

你的location @rewrites应该是这样的:

location @rewrites {
    rewrite "^(.*)/[0-9\-a-f]{36}(/.*)$" $1/__any_hash__$2 last;
    return 404;
}

$1$2捕获要替换的哈希之前和之后的URI片段。 last会导致location /api在替换后重新尝试。该过程将循环,直到完成所有替换。仅当完全替换的URI无法找到文件时才会调用return 404