为restful url重写Nginx url

为restful url重写Nginx url,rest,configuration,url-rewriting,nginx,static-files,Rest,Configuration,Url Rewriting,Nginx,Static Files,我有一个Rails web应用程序,在动态restful URL下有静态文件。例如: /projects/1/attachments/some_file.xls 我想将Nginx设置为重定向到服务器上的静态文件: /public/attachments/1/some_file.xls 其中1是动态项目id location block和rewrite语句如何查找Nginx配置文件 更新 我在下面标出了答案,因为它回答了我原来的问题。虽然在我的情况下,重写我的项目附件URL是不必要的。我忘了

我有一个Rails web应用程序,在动态restful URL下有静态文件。例如:

/projects/1/attachments/some_file.xls
我想将Nginx设置为重定向到服务器上的静态文件:

/public/attachments/1/some_file.xls
其中1是动态项目id

location block和rewrite语句如何查找Nginx配置文件


更新

我在下面标出了答案,因为它回答了我原来的问题。虽然在我的情况下,重写我的项目附件URL是不必要的。我忘了我已经在Rails视图erb中重新映射了url

我真正的目标是阻止Thin将缓存响应头添加到我的附件文件中。最终,我通过为附件添加一个位置(如:

location /attachments/ {
    expires    off;
    add_header Pragma "no-cache";
    add_header Cache-Control "no-cache, no-store";
    access_log off; 
    break;
}

下面是一个简单的例子

location /project/ {
    rewrite ^/project/([0-9]+)/attachments/(.*)$ /public/attachments/$1/$2 last;
}
如果需要更复杂的规则,请参阅官方帮助


下面是一个简单的例子

location /project/ {
    rewrite ^/project/([0-9]+)/attachments/(.*)$ /public/attachments/$1/$2 last;
}
如果需要更复杂的规则,请参阅官方帮助


听起来您的图像/文件库有问题,因为您不必为回形针、蜻蜓等执行任何nginx重写规则。例如,在曲别针中,当您在模型中使用DSL时,可以显式设置url和/或路径格式。对于回形针,它将如下所示:

has_attached_file :attachment,
                  :url => '/attachments/:id/:style/:basename.:extension',
                  :path => ':rails_root/public/attachments/:id/:style/:basename.:extension'

然后,nginx应该自动为所有内容提供服务,因为它位于您的公共目录中。无需重写规则。

听起来您的图像/文件库有问题,因为您不必为回形针、蜻蜓等执行任何nginx重写规则即可正常工作。例如,在曲别针中,当您在模型中使用DSL时,可以显式设置url和/或路径格式。对于回形针,它将如下所示:

has_attached_file :attachment,
                  :url => '/attachments/:id/:style/:basename.:extension',
                  :path => ':rails_root/public/attachments/:id/:style/:basename.:extension'

然后,nginx应该自动为所有内容提供服务,因为它位于您的公共目录中。不需要重写规则。

实际上,我忘记了URL已经在我的视图erb中手动重新映射。我真正想要实现的是绕过Thin,这样我就可以打开缓存相关的响应头了。而且,这些附件不是图像。他们生成了sql文件,生成了excel文件,上传了csv文件等。我没有使用回形针或附件,尽管我当时确实对它们进行了评估。我只是将这些附件存储在public/attachments/:project_id下,并对用户隐藏这一事实。用户可以看到url projects/:project\u id/file\u name。也没有模型。我提到的所有库都可以处理任何文件类型,而不仅仅是图像。但是,通常当我做一些类似于您正在做的事情时,我会创建一个资产模型来封装所有这些文件存储逻辑。只要绕过精简,您的公共目录中的任何内容都应该直接从您的web服务器(Apache、Nginx等)获得服务,而决不使用精简。只有在找不到给定url的匹配文件时,才会将其代理到精简。采用“Rails方式”的另一个原因是静态资产通过资产管道将时间戳附加到它们的名称上,这样您就不会意外地遇到您提到的缓存问题。我将Nginx添加到混合中,这样它就可以为文件提供服务器(无需缓存头),而不是精简。它现在似乎起作用了。这段对话很好,谢谢你的评论!实际上,我忘记了URL已经在我的视图erb中手动重新映射。我真正想要实现的是绕过Thin,这样我就可以打开缓存相关的响应头了。而且,这些附件不是图像。他们生成了sql文件,生成了excel文件,上传了csv文件等。我没有使用回形针或附件,尽管我当时确实对它们进行了评估。我只是将这些附件存储在public/attachments/:project_id下,并对用户隐藏这一事实。用户可以看到url projects/:project\u id/file\u name。也没有模型。我提到的所有库都可以处理任何文件类型,而不仅仅是图像。但是,通常当我做一些类似于您正在做的事情时,我会创建一个资产模型来封装所有这些文件存储逻辑。只要绕过精简,您的公共目录中的任何内容都应该直接从您的web服务器(Apache、Nginx等)获得服务,而决不使用精简。只有在找不到给定url的匹配文件时,才会将其代理到精简。采用“Rails方式”的另一个原因是静态资产通过资产管道将时间戳附加到它们的名称上,这样您就不会意外地遇到您提到的缓存问题。我将Nginx添加到混合中,这样它就可以为文件提供服务器(无需缓存头),而不是精简。它现在似乎起作用了。这段对话很好,谢谢你的评论!