0

我今天一直在努力了解 nginx 重写,并在这里阅读了几个问题/答案,并彻底阅读了我遇到的几个指南。

虽然大多数事情对我来说都很自然,但我只是没有掌握它,也许是因为我对任何形式的正则表达式都没有经验。

我有一个 download.php 脚本,它覆盖了我的 nginx 标头并强制浏览器使用“另存为”对话框执行下载,而不是打开一个新页面。

它工作得很好,但是我想对用户隐藏脚本本身的 url。

具体来说,我想更改此 URL:

http://www.example.com/scripts/download.php?id=http://www.example.com/images/0/1/fullsize/96698298450ca01a60875e_34.jpg

这样对用户来说,它只是显示为idGET 参数:

http://www.example.com/images/0/1/fullsize/96698298450ca01a60875e_34.jpg

但对于我的生活,我似乎无法让它发挥作用。

希望有人能来救援。提前致谢。

编辑:

只是为了让我的问题更加清晰......理想的解决方案是让我能够在我的网络应用程序中拥有这样的链接:

 http://www.example.com/images/0/1/fullsize/96698298450ca01a60875e_34.jpg?dl=1

让 nginx 发现它有一个 dl=1 并且在 /images/ 目录中,然后重写它以使用下载脚本:

  http://www.example.com/scripts/download.php?id=http://www.example.com/images/0/1/fullsize/96698298450ca01a60875e_34.jpg

这样,当仅查看图像时,它们将通过脚本,并且仅当 dl=1 参数到位时,图像才被重写并通过脚本路由。

4

1 回答 1

1

如果我正确理解您的问题,您想http://www.example.com/images/0/1/fullsize/96698298450ca01a60875e_34.jpg&dl=1在您的网络应用程序中放置链接,当用户单击链接时,他们会被重定向到 download.php 脚本?

假设您要重定向到同一主机,下面的 rewrite 指令应该可以实现这一点。这将应用于以查询参数开头的任何url 路径。这将执行 302(临时)重定向。如果您想要永久 (301) 重定向,请替换为./images/ dl=1redirectpermanent

location /images/ {
    if ($args ~ "dl=1") {
        rewrite ^/images/(.*)$ /scripts/donwloads.php?id=$scheme://$host/images/$1 redirect;
    }
}

如果您尝试另一种方式(具有指向 download.php 脚本的链接,但将用户重定向到实际资源 url - 不知道为什么,并且可能做这样的盲目重定向是一个坏主意),您可以这样做指令(值得检查id查询字符串参数是否存在)

location /scripts/download.php {
    rewrite ^(.*)$ $arg_id? permanent;
}

让我知道这些解决方案中的任何一个是否朝着您想要的方向发展,我们可以对其进行调整以满足您的需求。

于 2012-12-18T13:58:04.810 回答