iFrey
V2EX  ›  问与答

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

  •  
  •   iFrey ·
    PRO
    · Aug 2, 2023 · 1429 views
  •   You need to sign in to view this topic
    This topic created in 1084 days ago, the information mentioned may be changed or developed.

    我想要达到像 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;
    }
    ?>
    
    

    感谢解答

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