nginx 根据 URL 引入不同的文件

编程世界中各种奇奇怪怪的需求都有,本次遇到一个需求:根据URL参数判断,包含 xxx=00001 的页面上,引入的 test.js 文件要去掉一部分代码,但是带有参数和不带参数的页面 js 链接都为 http://localhost/test.js。意思就是同一个 test.js 需要根据页面 URL 参数不同,返回不同的内容。并且不能在 js 里面添加判断,因为 js 代码里面的判断一眼就能看出来。

方案一:test.js文件改为动态内容

test.php 示例:

1
2
3
4
5
6
7
8
9
10
<?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.jshttp://localhost/test.php

作为一个瑟瑟发抖的小前端,终于想起了 nginx 这个神器,还好生产环境也有 nginx,捣腾了一下,最终实现如下:

方案二:使用 nginx 配置不同文件

1
2
3
4
5
6
7
8
9
10
11
12
server {
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 文件不会被缓存,每次请求都会重新加载,会影响加载速度,酌情考虑是否需要此配置。

本文由 linx(544819896@qq.com) 创作,采用 CC BY 4.0 CN协议 进行许可。 可自由转载、引用,但需署名作者且注明文章出处。本文链接为: https://blog.jijian.link/2020-06-30/nginx-import-file/

如果您觉得文章不错,可以点击文章中的广告支持一下!