【问题标题】:How do I rewrite an Nginx request to a specific local file with a specific pattern如何将 Nginx 请求重写为具有特定模式的特定本地文件
【发布时间】:2015-08-12 17:29:19
【问题描述】:

我无法理解在 Nginx 中使用正则表达式和提取变量。

我想将所有文件请求写入特定目录路径中包含单词/development/ 的文件。

/development/1.1000038/assets/css/something.css

应该返回文件:

/usr/share/nginx/html/public_html/assets/css/something.css

还有:

/development/1.1000038/assets/js/something.js

应该返回文件:

/usr/share/nginx/html/public_html/assets/js/something.js

等等……

只要存在/development/,传入请求的 URL 结构将始终相同。即/development/ 然后/(version_number)/ 最后是我希望使用的 URL 的实际部分。

我似乎能够匹配和拦截任何带有单词 /development/ 的传入请求,但在提取和使用 URL 的其余部分时遇到问题。

任何帮助将不胜感激。

编辑:

这是我尝试过的:

location ~ /development/(.*?)/(.*) {
   try_files /usr/share/nginx/html/public_html/$2 /dev/null;
}

我的想法是我应该匹配/development/ 部分。带有(.*?) 的版本号,然后是带有最终(.*) 的URL 的其余部分

然后我假设我可以只使用 $2 变量并在我的 try_files 指令中使用它。不幸的是,这似乎不起作用。

我也尝试过匹配并使用我真正需要的部分:

location ~ /development/[A-Za-z0-9\.]+/(.*) {
        try_files /usr/share/nginx/html/public_html/$1 /dev/null;
}

我对正则表达式一点也不擅长,但在我使用的在线测试仪中,它们似乎与 URL 的正确部分匹配。

【问题讨论】:

  • 您在匹配整个 URL 或只是替换时遇到问题?如果是第二件事,您应该编辑您的问题并发布您的尝试。
  • 按要求编辑...

标签: regex nginx url-rewriting


【解决方案1】:

通过反复试验,我最终意识到自己做错了什么。

事实证明,try_files 使用 root 参数作为您尝试请求的任何文件的前缀。

因此,我有效地应用了两次根路径。通过删除我上面的​​任何一个示例的根路径都可以正常工作。

location ~ /development/[A-Za-z0-9\.]+/(.*) {
        try_files /$1 /dev/null;
}

【讨论】:

    猜你喜欢
    • 2013-03-19
    • 2018-02-23
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    • 2016-04-01
    相关资源
    最近更新 更多