V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
vsean
V2EX  ›  问与答

求教关于 nginx 配置 curl 访问的问题

  •  
  •   vsean · 2023-08-02 22:03:29 +08:00 · 935 次点击
    这是一个创建于 514 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我想要达到像 ip.me 一样,通过 curl ip.me 访问会返回 IP

    网站 nginx 配置了 http 到 https 的 301 跳转

    现在,通过 curl -L 域名 或 curl https://域名 访问可以正常返回 IP

    但是由于 nginx 的 301 跳转,curl 域名 没有任何信息返回

    要如何才能让 curl 域名 正常返回 IP 呢?

    curl 返回 IP 的代码如下:

    <?php
    function getIp(){
      if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
      } elseif (isset($_SERVER['HTTP_X_REAL_IP'])) { 
        $ip = $_SERVER['HTTP_X_REAL_IP'];
      } elseif (isset($_SERVER['HTTP_X_IP'])) {
        $ip = $_SERVER['HTTP_X_IP'];
      } else {
        $ip = $_SERVER['REMOTE_ADDR'];
      }
      return $ip;
    }
    
    //当使用 cURL 访问时,返回访问者 IP 地址
    if(!empty($_SERVER['HTTP_USER_AGENT']) && strpos($_SERVER['HTTP_USER_AGENT'], 'curl') !== false){
      $ip = getIp(); 
      $ip = urldecode($ip);
    // 在输出前去掉空格,mac 终端下有的 IP 地址后面有空格
    $ip = trim($ip);
    // 输出后换行,linux 下避免换行不正确的问题
    echo $ip . "\n";
      exit;
    }
    ?>
    
    

    感谢解答

    第 1 条附言  ·  2023-08-03 03:39:49 +08:00
    还有一个问题的难点是用了 CF ,没有办法正确传递 UA
    10 条回复    2023-08-03 12:24:19 +08:00
    lhbc
        1
    lhbc  
       2023-08-02 22:21:44 +08:00 via Android
    不明白,curl -L 不是会跟随 301 302 307 308 吗?
    vsean
        2
    vsean  
    OP
       2023-08-02 22:29:44 +08:00
    @lhbc #1 是的 curl -L 是跟随,就是用起来体验不好,还要输入-L ,我是想达到直接 curl 域名,就可以,这样简单一些
    lhbc
        3
    lhbc  
       2023-08-02 23:11:46 +08:00 via Android
    @vsean 在 nginx 里判断 ua ,如果是 curl 就不跳转
    Suaxi
        4
    Suaxi  
       2023-08-02 23:33:21 +08:00 via Android
    可以试试直接在 nginx 加
    location /ip {
    add_header Content-Type text/plain;
    return 200 $remote_addr;
    }
    vsean
        5
    vsean  
    OP
       2023-08-03 03:30:39 +08:00
    @Suaxi #4 我需要设置首页,不能是 ip 目录,也不能直接用 nginx 返回,用了 CF ,如果直接 nginx 返回是 CF 的 CDN ip ,必须是由首页的 index.php 返回 IP
    vsean
        6
    vsean  
    OP
       2023-08-03 03:39:34 +08:00
    还有一个问题的难点是用了 CF ,没有办法正确传递 UA
    ratazzi
        7
    ratazzi  
       2023-08-03 07:58:34 +08:00 via iPhone
    用了 CF 那直接用 workers 处理就行了,而且 CF 怎么就不能正确传递 UA 了
    ClarkAbe
        8
    ClarkAbe  
       2023-08-03 09:11:39 +08:00 via Android
    @vsean #5 官方那么详细的文档文档你是一点不看啊...闭门造车? https://developers.cloudflare.com/fundamentals/get-started/reference/http-request-headers/
    ik
        9
    ik  
       2023-08-03 09:28:19 +08:00 via iPhone
    @vsean #5 你这情况一样可以用 nginx 直接返回,下面的文档看一看
    yumusb
        10
    yumusb  
       2023-08-03 12:24:19 +08:00
    location / {
    default_type text/html ;
    if ($http_user_agent ~* (Curl|Wget)){
    return 200 "$http_cf_connecting_ip\n";
    }
    }
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2408 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 02:12 · PVG 10:12 · LAX 18:12 · JFK 21:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.