使用Nginx命名location复用配置后无法正确设置Expires头的问题求助
Nginx命名location复用配置后无法正确设置Expires头的问题求助
你遇到的这个问题其实是Nginx内部跳转的上下文特性导致的——当用try_files跳转到命名location时,原location里的expires这类响应头设置不会被继承,因为内部跳转相当于进入了一个全新的配置上下文,原location的指令不会跟着带过去。
下面给你两种可行的解决方案,都能实现复用uwsgi配置同时保留不同过期策略的需求:
方案一:使用变量传递过期时间
通过在主location中定义变量来指定过期时间,然后在命名location中引用这个变量设置expires,这样就能把不同的过期策略传递到复用的配置里:
server { # 定义默认过期时间变量 set $expires_value 7d; location @uwsgi { uwsgi_pass myproject; include uwsgi_params; # 引用变量设置过期时间 expires $expires_value; } location ~ ^/(admin|login|search) { # 为这类请求覆盖过期时间变量 set $expires_value -1; uwsgi_cache off; try_files $uri @uwsgi; } location / { # 显式设置默认过期时间(也可以依赖全局定义的变量) set $expires_value 7d; try_files $uri @uwsgi; } }
方案二:使用map指令统一管理过期策略
如果你的路径规则更复杂,用map指令在全局层面根据请求路径映射过期时间会更清晰,适合后续扩展:
http { # 根据请求URI映射对应的过期时间 map $request_uri $expires_value { ~^/(admin|login|search) -1; default 7d; } server { location @uwsgi { uwsgi_pass myproject; include uwsgi_params; # 引用map生成的变量设置过期时间 expires $expires_value; } location ~ ^/(admin|login|search) { uwsgi_cache off; try_files $uri @uwsgi; } location / { try_files $uri @uwsgi; } } }
两种方案的核心思路都是把过期时间的配置从主location传递到命名location中,因为内部跳转后只有命名location的指令会生效,通过变量就能让不同请求带上对应的过期头了。另外uwsgi_cache off这个配置可以保留在原location里,它是针对该请求上下文的设置,不需要传递到命名location。
备注:内容来源于stack exchange,提问作者janeden
相关产品推荐
相关产品推荐

