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.jshttp://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 文件不会被缓存,每次请求都会重新加载,会影响加载速度,酌情考虑是否需要此配置。

 

posted @ 2020-06-30 15:55  极·简  Views(1496)  Comments(0Edit  收藏  举报