nginx 根据 URL 参数引入不同的文件
同步发布:https://blog.jijian.link/2020-06-30/nginx-import-file/
编程世界中各种奇奇怪怪的需求都有,本次遇到一个需求:根据URL参数判断,包含 xxx=00001 的页面上,引入的 test.js 文件要去掉一部分代码,但是带有参数和不带参数的页面 js 链接都为 http://localhost/test.js
。意思就是同一个 test.js 需要根据页面 URL 参数不同,返回不同的内容。并且不能在 js 里面添加判断,因为 js 代码里面的判断一眼就能看出来。
方案一:test.js文件改为动态内容
test.php 示例:
<?php $js = file_get_contents('./test.js'); $referer = parse_url($_SERVER['HTTP_REFERER']); parse_str($referer['query'], $query); if ($query['xxx'] === '00001') { // 需要替换的内容 $js = str_replace(1, 1123, $js); } echo $js; ?>
这样也可以达到替换效果,但是有个问题必须修改 http://localhost/test.js
为 http://localhost/test.php
。
作为一个瑟瑟发抖的小前端,终于想起了 nginx
这个神器,还好生产环境也有 nginx
,捣腾了一下,最终实现如下:
方案二:使用 nginx 配置不同文件
server { # xxxxxxx # xxxxxxx set $test "D:/www/test.js"; if ($http_referer ~* "xxx=00001") { set $test "D:/www/test1.js"; } location /test.js { alias $test; add_header Cache-Control "private, no-store, no-cache, must-revalidate, proxy-revalidate"; add_header Pragma no-cache; add_header Expires 0; } }
此配置的大概意思是:如果 referer
包含 xxx=00001
,那么就返回 D:/www/test1.js
否则返回 D:/www/test.js
。
后三行的 add_header
作用告诉浏览器不缓存此文件。当然这个配置也有个问题,就是 js 文件不会被缓存,每次请求都会重新加载,会影响加载速度,酌情考虑是否需要此配置。