我只有 Nginx 上游的经验,而不是静态文件的服务。
Nginx 有一个默认服务器,它提供欢迎使用 nginx!页面并在虚拟主机上没有匹配项时显示。我想保留此默认页面,但将200状态代码覆盖为404。
我不知道该怎么做。有任何想法吗?
我正在尝试在 Nginx 上设置一堆虚拟主机,并且我想在向上游传递请求之前设置一些标头。我有一些我总是想设置的标题,然后我有一些我想为选定的位置块设置的标题。
不幸的是,它似乎是Nginx的不允许proxy_set_header
多层次的指令,因此,它只是将清除HTTP模块设置任何头。
Nginx 文档说明了以下内容proxy_set_header
:
允许重新定义或附加字段到传递给代理服务器的请求标头。该值可以包含文本、变量及其组合。当且仅当当前级别上没有定义 proxy_set_header 指令时,这些指令才从上一级继承。
所以问题是……要么 Nginx 有一个令人失望的限制,要么我以错误的方式思考这个问题。
关于这个问题的惯用解决方案的任何想法?
我正在尝试将 Nginx 设置为在 Unicorn 上运行的 Rails 应用程序的反向代理。
我的应用程序有一些公共页面,我想将它们缓存 60 分钟,因此我设置了 max-age 标头。
此外,我已将 proxy_cache 选项添加到 Nginx 中的服务器块中。
proxy_cache default;
Run Code Online (Sandbox Code Playgroud)
并定义了这个缓存
proxy_cache_path /var/www/nginx_cache keys_zone=default:10m max_size=500m;
Run Code Online (Sandbox Code Playgroud)
我已设置我的应用程序以将此标头添加到我的可缓存响应中
Cache-Control: max-age=3600, public
Run Code Online (Sandbox Code Playgroud)
当客户端第一次访问该页面时,将呈现该页面并返回响应。然而,在随后的请求中,nginx 不会减少 max-age 计数器。
因此,访问者可能会在页面过期前一分钟访问我的页面,这意味着他看到的是 59 分钟前的内容。但随后将此副本在他的浏览器中再保留 60 分钟,然后他就会获得新副本。
我可以让 Nginx 减去经过的时间,这样如果访问者访问已在 Nginx 缓存中 25 分钟的页面,则 max-age 将为 35 分钟(2100 秒)?
我想添加一个请求标头,指示请求是来自桌面客户端还是移动客户端。
我尝试在服务器块中添加它
if ($http_user_agent ~* 'mobile|phone') && ($http_user_agent !~* 'ipad') {
proxy_set_header X-Device-Category "mobile";
} else {
proxy_set_header X-Device-Category "desktop";
}
Run Code Online (Sandbox Code Playgroud)
但nginx -t
回应"if" directive is not allowed here
我可以从各种帖子中了解到if
在 Nginx 中无法像您想象的那样工作,但我不确定其他方法来解决这个问题。
将这个简单的逻辑移入应用程序在这里不是一个选项,因为 Nginx 将需要它作为缓存键。