dd998 发表于 2025-1-13 12:17:19

50元找人写一个nginx配置文件

付费50元,找人帮我写一个NGINX配置文件:<br />
<br />
当用户是中国的广东省和上海市的时候,20%的概率跳转去 &quot;https://example.com&quot;<br />
<br />
请私信我

solomon 发表于 2025-1-13 12:20:49

这个可以使用DNS分区解析实现的

shc 发表于 2025-1-13 12:23:54

同意2楼,建议用DNS分区解析实现。<br />
Nginx实现我以前做过,需要接入Lua提供随机数才能做到20%概率,如果只用Nginx实现会变成要么100%要么0%.

小学生 发表于 2025-1-13 12:24:24

打钱吧<br />
<br /><div class="blockcode"><div id="code_Xac"><ol><li>http {<br /><li># GeoIP2 数据库配置<br /><li>geoip2 /usr/share/GeoIP/GeoLite2-City.mmdb {<br /><li>auto_reload 60m;<br /><li>$geoip2_data_region_name default=- source=$remote_addr region name en;<br /><li>$geoip2_data_city_name default=- source=$remote_addr city name en;<br /><li>}<br /><li><br /><li># 定义随机数变量<br /><li>map $remote_addr $random {<br /><li>default   0;<br /><li>&quot;~.&quot;   &quot;${time_iso8601}${remote_addr}&quot;;<br /><li>}<br /><li><br /><li># 定义跳转概率变量(20%概率)<br /><li>map $random $redirect {<br /><li>&quot;~^.{8}&quot;1;# 约20%概率 (4/20)<br /><li>default0;<br /><li>}<br /><li><br /><li># 定义是否在目标地区<br /><li>map $geoip2_data_region_name$geoip2_data_city_name $is_target_location {<br /><li>&quot;GuangdongShanghai&quot;1;<br /><li>default   0;<br /><li>}<br /><li><br /><li>server {<br /><li>listen 80;<br /><li>server_name your_domain.com;<br /><li><br /><li>location / {<br /><li>    if ($is_target_location = 1) {<br /><li>      if ($redirect = 1) {<br /><li>      return 302 https://example.com;<br /><li>      }<br /><li>    }<br /><li>    <br /><li>    # 如果不满足跳转条件,继续处理正常内容<br /><li>    proxy_pass http://backend;<br /><li>    # ... 其他正常的配置 ...<br /><li>}<br /><li>}<br /><li>}<br /><li><br /><li>events {<br /><li>worker_connections 1024;<br /><li>}</ol></div><em onclick="copycode($('code_Xac'));">复制代码</em></div>

stingeo 发表于 2025-1-13 12:27:32

AI实现不了?<img src="https://hostloc.com/static/image/smiley/default/shocked.gif" smilieid="6" border="0" alt="" /><img src="https://hostloc.com/static/image/smiley/default/shocked.gif" smilieid="6" border="0" alt="" /><img src="https://hostloc.com/static/image/smiley/default/shocked.gif" smilieid="6" border="0" alt="" />

dd998 发表于 2025-1-13 13:10:31

<div class="quote"><blockquote><font size="2"><a href="https://hostloc.com/forum.php?mod=redirect&goto=findpost&pid=16185912&ptid=1382332" target="_blank"><font color="#999999">小学生 发表于 2025-1-13 12:24</font></a></font><br />
打钱吧</blockquote></div><br />
<br />
这个是加载一次/usr/share/GeoIP/GeoLite2-City.mmdb所有来访用户共用,还是每个来访用户都加载一次?<br />
<br />

武大娘 发表于 2025-1-13 12:24:00

<div class="blockcode"><div id="code_rqG"><ol><li>http {<br /><li># 定义地理信息模块,识别客户端IP对应的地区信息<br /><li>geo $geo {<br /><li>default 0;<br /><li># 根据实际的IP地址范围来设置对应地区标识,这里示例简单示意,实际需准确的IP段配置<br /><li>include conf/geoip/geoip.conf;<br /><li>}<br /><li><br /><li># 定义映射关系,用于后续判断是否跳转等逻辑<br /><li>map $geo $redirect {<br /><li>default 0;<br /><li>&quot;广东&quot; 1;<br /><li>&quot;上海&quot; 1;<br /><li>}<br /><li><br /><li># 定义变量用于模拟20%概率<br /><li>map $redirect $random_redirect {<br /><li>0 0;<br /><li>1 $random;<br /><li>}<br /><li><br /><li># 配置server块,根据你的实际域名等情况调整<br /><li>server {<br /><li>listen 80;<br /><li>server_name your_domain.com;<br /><li><br /><li>location / {<br /><li>    if ($random_redirect ~ &quot;0.2&quot;) {<br /><li>      return 302 https://example.com;<br /><li>    }<br /><li>    # 这里正常处理其他请求,比如可以配置代理等逻辑,下面是简单示例返回<br /><li>    root /var/www/html;<br /><li>    index index.html;<br /><li>}<br /><li>}<br /><li>}<br /><li></ol></div><em onclick="copycode($('code_rqG'));">复制代码</em></div><br />
<br />
几点说明:<br />
<br />
上述配置中的 include conf/geoip/geoip.conf 部分,你需要在 conf/geoip/ 目录下有一个准确的 geoip.conf 文件,里面按照 ngx_http_geo_module 的语法格式填写好广东省和上海市对应的IP段范围,例如:<br /><div class="blockcode"><div id="code_Ow4"><ol><li>geoip_country /path/to/GeoIP.dat;<br /><li>geoip_city /path/to/GeoLiteCity.dat;<br /><li><br /><li>map $geoip_country_code $geo {<br /><li>CN {<br /><li>if ($geoip_city ~* &quot;广州|深圳|佛山|东莞|珠海|中山|惠州|汕头|江门|肇庆|湛江|茂名|韶关|清远|云浮|阳江|河源|汕尾|潮州|揭阳|梅州|上海&quot;) {<br /><li>    return $geoip_city;<br /><li>}<br /><li>}<br /><li>default 0;<br /><li>}<br /><li></ol></div><em onclick="copycode($('code_Ow4'));">复制代码</em></div><br />
这里假设你安装了对应的 GeoIP 相关的数据库文件(可从官方渠道获取并配置好路径),并且通过正则表达式来匹配广东省主要城市以及上海市来标记地区。<br />
<br />
概率部分通过 $random 变量结合 map 来简单模拟,它在每次请求时会生成一个0到1之间的随机数,我们通过 if 判断这个随机数是否接近0.2来模拟20%概率跳转的情况。<br />
确保你的NGINX已经正确安装了相关的模块(比如 ngx_http_geo_module 、 ngx_http_map_module 等,一般默认是安装了的),并且根据实际情况调整好 server_name 等配置内容来适配你的真实服务场景。

人穷器短 发表于 2025-1-13 13:16:19

<div class="quote"><blockquote><font size="2"><a href="https://hostloc.com/forum.php?mod=redirect&goto=findpost&pid=16186019&ptid=1382332" target="_blank"><font color="#999999">dd998 发表于 2025-1-13 13:10</font></a></font><br />
这个是加载一次/usr/share/GeoIP/GeoLite2-City.mmdb所有来访用户共用,还是每个来访用户都加载一次 ...</blockquote></div><br />
这还用问。。。<br />
<br />
更好的实现方法楼上都讲了

文化痞子 发表于 2025-1-13 13:17:42

1. 安装并配置 GeoIP2<br />
下载 MaxMind 的 GeoLite2-City 数据库(免费版本)<br />
解压并将 GeoLite2-City.mmdb 放到服务器上的某个目录,比如 /etc/nginx/GeoLite2-City.mmdb。<br />
确认你的 NGINX 已编译并支持 ngx_http_geoip2_module,或者安装对应的第三方模块。<br />
2. 配置示例<br />
假设你想在 server_name yourdomain.com; 这个虚拟主机中进行操作,可以在主配置文件(一般是 /etc/nginx/nginx.conf)或者对应的 vhost 配置文件中,添加以下内容:<br />
<br /><div class="blockcode"><div id="code_gFG"><ol><li>nginx<br /><li>复制代码<br /><li>http {<br /><li># ------------------------------------------<br /><li># 1. 载入 GeoIP2 数据库,并映射到变量<br /><li># ------------------------------------------<br /><li>geoip2 /etc/nginx/GeoLite2-City.mmdb {<br /><li># 国家代码<br /><li>$geoip2_data_country_code country iso_code;<br /><li># 省份(对于中国而言,这里表示 &quot;subdivision 1&quot;)<br /><li>$geoip2_data_subdivision_1_name subdivision 1 names en;<br /><li>}<br /><li><br /><li># ------------------------------------------<br /><li># 2. 判断是否为广东省或上海市<br /><li>#根据 $geoip2_data_subdivision_1_name<br /><li>#可能需要检查实际数据库返回的字段 &quot;Guangdong&quot;/&quot;Shanghai&quot; 等字样<br /><li># ------------------------------------------<br /><li>map $geoip2_data_subdivision_1_name $target_province {<br /><li>default0;   # 默认为 0,表示不匹配<br /><li>&quot;Guangdong&quot; 1;      # 广东<br /><li>&quot;Shanghai&quot;1;      # 上海<br /><li>}<br /><li><br /><li># ------------------------------------------<br /><li># 3. 按一定概率拆分用户:20% 重定向,80% 不重定向<br /><li>#split_clients 指令基于一致性哈希,可用 IP、User-Agent 等<br /><li># ------------------------------------------<br /><li>split_clients &quot;${remote_addr}&quot; $bucket_split {<br /><li>20%&quot;redirect&quot;;# 这里设置 20% 概率<br /><li>*&quot;no_redirect&quot;; <br /><li>}<br /><li><br /><li># ------------------------------------------<br /><li># 4. 根据上面两个条件联合判断是否重定向<br /><li>#可以使用 map 将两个变量组合,或直接在 server 中 if 判断<br /><li># ------------------------------------------<br /><li><br /><li>server {<br /><li>listen   80;<br /><li>server_nameyourdomain.com;<br /><li><br /><li># 4.1 若是广东或上海,且 bucket_split 为 &quot;redirect&quot;,则执行跳转<br /><li>if ($target_province = 1) {<br /><li>    if ($bucket_split = &quot;redirect&quot;) {<br /><li>      return 302 https://example.com;<br /><li>    }<br /><li>}<br /><li><br /><li># ------------------------------------------<br /><li># 其余情况,正常访问<br /><li># ------------------------------------------<br /><li>location / {<br /><li>    # 正常业务逻辑<br /><li>    # 例如:<br /><li>    # proxy_pass http://127.0.0.1:8080;<br /><li>    # 或直接提供静态文件<br /><li>}<br /><li>}<br /><li>}</ol></div><em onclick="copycode($('code_gFG'));">复制代码</em></div><br />
配置说明<br />
geoip2 指令块<br />
<br />
geoip2 /etc/nginx/GeoLite2-City.mmdb {...} 用于指定城市级数据库路径。<br />
$geoip2_data_country_code 变量中会存储 IP 所属国家的 ISO Code(比如 CN), $geoip2_data_subdivision_1_name 变量中会存储该 IP 所属的省/州名称(比如 Guangdong 或 Shanghai)。<br />
map 指令<br />
<br />
将 $geoip2_data_subdivision_1_name 的取值进行映射,当检测到 “Guangdong” 或 “Shanghai” 时,赋值为 1,否则为 0。<br />
如果你的 GeoIP2 数据库返回的中文字段(比如 广东省、上海市),或是拼音(比如 Guangdong Sheng 等),请相应修改映射的值。<br />
split_clients 指令<br />
<br />
按 20% 对 80% 的比例,将用户分配到 redirect 或 no_redirect 两个桶中。<br />
这里使用了 &quot;$remote_addr&quot; 作为散列依据,也可以改用 &quot;$remote_addr$http_user_agent&quot; 等组合,以减少同 IP 多次访问时固定分配的问题。<br />
if 判断<br />
<br />
首先检查 $target_province 是否为 1(即是否为广东/上海),再检查 $bucket_split 是否为 redirect,若都满足则重定向到 https://example.com。<br />

1121744186Help 发表于 2025-1-13 13:10:00

<div class="quote"><blockquote><font color="#999999">小学生 发表于 2025-1-13 12:24</font><br />
<font color="#999999">打钱吧</font></blockquote></div><br />
有错误吧,好像 location 里面的 if 不能嵌套<div class="blockcode"><div id="code_kuu"><ol><li># 定义geo模块,根据IP地址确定地区<br /><li>geo $region {<br /><li>default &quot;&quot;;<br /><li># 广东省的IP地址段,此处需要替换为真实的广东省IP地址段范围,可从相关IP地址库获取<br /><li>113.0.0.0/8&quot;guangdong&quot;;<br /><li># 上海市的IP地址段,此处需要替换为真实的上海市IP地址段范围,可从相关IP地址库获取<br /><li>101.0.0.0/8&quot;shanghai&quot;;<br /><li>}<br /><li><br /><li>server {<br /><li>listen   80;<br /><li>server_nameyour_domain.com; # 替换为你的域名<br /><li><br /><li># 生成一个0到1之间的随机数<br /><li>set $random_number ${random};<br /><li># 计算是否需要跳转,这里使用random变量模拟20%的概率,即如果随机数小于0.2则跳转<br /><li>set $should_redirect &quot;&quot;;<br /><li>if ($region ~* &quot;guangdong|shanghai&quot; &amp;&amp; $random_number &lt; 0.2) {<br /><li>set $should_redirect &quot;yes&quot;;<br /><li>}<br /><li><br /><li>if ($should_redirect = &quot;yes&quot;) {<br /><li>return 302 https://example.com; # 跳转到目标网址<br /><li>}<br /><li><br /><li># 其他正常的server配置内容<br /><li>location / {<br /><li># 这里是网站的默认处理逻辑<br /><li>root /usr/share/nginx/html;<br /><li>indexindex.html index.htm;<br /><li>}<br /><li>}</ol></div><em onclick="copycode($('code_kuu'));">复制代码</em></div>
页: [1] 2
查看完整版本: 50元找人写一个nginx配置文件