如何在curl中设置自定义的HTTP头

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在curl中设置自定义的HTTP头相关的知识,希望对你有一定的参考价值。

1、首先我们打开IIS管理器,找到“HTTP响应标头”。

2、然后我们双击打开“HTTP响应标头”选项。

3、在弹出界面内名称填写:X-Frame-Options,值填写:SAMEORIGIN,DENY:浏览器拒绝当前页面加载任何Frame页面,SAMEORIGIN:frame页面的地址只能为同源域名下的页面,ALLOW-FROM:origin为允许frame加载的页面地址。

4、然后我们重启IIS即可完成设置。

参考技术A 把自定义http头放入hearders array, 然后用CURLOPT_HTTPHEADER设置。

$headers = array();
$headers[] = 'X-Apple-Tz: 0';
$headers[] = 'X-Apple-Store-Front: 143444,12';
$headers[] = 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
$headers[] = 'Accept-Encoding: gzip, deflate';
$headers[] = 'Accept-Language: en-US,en;q=0.5';
$headers[] = 'Cache-Control: no-cache';
$headers[] = 'Content-Type: application/x-www-form-urlencoded; charset=utf-8';
$headers[] = 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:28.0) Gecko/20100101 Firefox/28.0';
$headers[] = 'X-MicrosoftAjax: Delta=true';

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);本回答被提问者和网友采纳
参考技术B 问题:我正尝试使用curl命令获取一个URL,但除此之外我还想在传出的HTTP请求中设置一些自定义的头部字段。我如何能够在curl中使用自定义的HTTP头呢?
curl是一个强大的命令行工具,它可以通过网络将信息传递给服务器或者从服务器获取数据。他支持很多的传输协议,尤其是HTTP/HTTPS以及其他诸如FTP/FTPS, RTSP, POP3/POP3S, SCP, IMAP/IMAPS协议等。当你使用curl向一个URL发送HTTP请求的时候,它会使用一个默认只包含必要的头部字段(如:User-Agent, Host, and Accept)的HTTP头。

在一些个例中,或许你想要在一个HTTP请求中覆盖掉默认的HTTP头或者添加一个新的自定义头部字段。例如,你或许想要重写“HOST”字段来测试一个负载均衡,或者通过重写"User-Agent"字符串来假冒特定浏览器以解决一些访问限制的问题。
为了解决所有这些问题,curl提供了一个简单的方法来完全控制传出HTTP请求的HTTP头。你需要的这个参数是“-H” 或者 “--header”。
为了定义多个HTTP头部字段,"-H"选项可以在curl命令中被多次指定。
例如:以下命令设置了3个HTTP头部字段。也就是说,重写了“HOST”字段,并且添加了两个字段("Accept-Language" 和 "Cookie")
$ curl -H 'Host: 157.166.226.25' -H 'Accept-Language: es' -H 'Cookie: ID=1234' http://cnn.com

对于"User-Agent", "Cookie", "Host"这类标准的HTTP头部字段,通常会有另外一种设置方法。curl命令提供了特定的选项来对这些头部字段进行设置:
-A (or --user-agent): 设置 "User-Agent" 字段.
-b (or --cookie): 设置 "Cookie" 字段.
-e (or --referer): 设置 "Referer" 字段.
例如,以下两个命令是等效的。这两个命令同样都对HTTP头的"User-Agent"字符串进行了更改。
$ curl -H "User-Agent: my browser" http://cnn.com$ curl -A "my browser" http://cnn.com

wget是另外一个类似于curl,可以用来获取URL的命令行工具。并且wget也一样允许你使用一个自定义的HTTP头。点击这里查看wget命令的详细信息。

如何在 Kubernetes 中设置自定义 HTTP 错误

【中文标题】如何在 Kubernetes 中设置自定义 HTTP 错误【英文标题】:How to set up a custom HTTP error in Kubernetes 【发布时间】:2020-05-21 14:58:01 【问题描述】:

我想创建一个自定义 403 错误页面。 目前我已经创建了一个入口,并且在注释中我有这样的内容:

"nginx.ingress.kubernetes.io/whitelist-source-range": "100.01.128.0/20,88.100.01.01"

因此,任何在该 IP 范围之外访问我的网络应用程序的尝试都会收到 403 错误。

为了创建自定义页面,我尝试添加以下注释:

"nginx.ingress.kubernetes.io/custom-http-errors": "403",
"nginx.ingress.kubernetes.io/default-backend": "default-http-backend"

其中 default-http-backend 是已部署应用的名称。

入口有这个:


  "kind": "Ingress",
  "apiVersion": "extensions/v1beta1",
  "metadata": 
    "name": "my-app-ingress",
    "namespace": "my-app-test",
    "selfLink": "/apis/extensions/v1beta1/namespaces/my-app-test/ingresses/my-app-ingress",
    "uid": "8f31f2b4-428d-11ea-b15a-ee0dcf00d5a8",
    "resourceVersion": "129105581",
    "generation": 3,
    "creationTimestamp": "2020-01-29T11:50:34Z",
    "annotations": 
      "kubernetes.io/ingress.class": "nginx",
      "nginx.ingress.kubernetes.io/custom-http-errors": "403",
      "nginx.ingress.kubernetes.io/default-backend": "default-http-backend",
      "nginx.ingress.kubernetes.io/rewrite-target": "/",
      "nginx.ingress.kubernetes.io/whitelist-source-range": "100.01.128.0/20,90.108.01.012"
    
  ,
  "spec": 
    "tls": [
      
        "hosts": [
          "my-app-test.retail-azure.js-devops.co.uk"
        ],
        "secretName": "ssl-secret"
      
    ],
    "rules": [
      
        "host": "my-app-test.retail-azure.js-devops.co.uk",
        "http": 
          "paths": [
            
              "path": "/api",
              "backend": 
                "serviceName": "my-app-backend",
                "servicePort": 80
              
            ,
            
              "path": "/",
              "backend": 
                "serviceName": "my-app-frontend",
                "servicePort": 80
              
            
          ]
        
      
    ]
  ,
  "status": 
    "loadBalancer": 
      "ingress": [
        
      ]
    
  

但我总是得到默认的 403。 我错过了什么?

【问题讨论】:

我在这里试过你的配置,一切都很好。您的服务“my-app-frontend”、“default-http-backend”和入口在同一个命名空间中? 它们都在同一个前端,但是当我从非白名单 IP 访问我的网络应用程序时,我没有看到“default-http-backend”...(我仍然看到真正的默认值一)。我不知道它是如何为您工作或为什么...可能是因为我将“default-http-backend”用作服务名称...这可能是一个冲突 你能描述一下服务 default-http-backend 吗?您还可以提供您想要作为默认后端的 pod 的 ips 吗? 【参考方案1】:

我想创建一个自定义 403 错误页面。目前我已经在注释中创建了一个入口。 因此,任何在该 IP 范围之外访问我的 Web 应用程序的尝试都会收到 403 错误。 为了创建自定义页面,我尝试添加以下注释:

kind: Ingress
metadata:
  name: my-app-ingress
  namespace: default
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: "/"
    nginx.ingress.kubernetes.io/custom-http-errors: '403'
    nginx.ingress.kubernetes.io/default-backend: default-http-backend
    nginx.ingress.kubernetes.io/whitelist-source-range: 125.10.156.36/32
spec:
  rules:
  - host: venkat.dev.vboffice.com
    http:
      paths:
      - path: "/"
        backend:
          serviceName: custom-http-backend
          servicePort: 80

其中 default-http-backend 是已经使用默认 nginx 页面部署的应用的名称。

如果我使用白名单 IP 在家进行测试,则会显示自定义页面,但如果我尝试在 4G 网络中使用手机访问,则会显示默认后端 404

我需要添加任何 nginx 配置更改 custom-http-backend pod????

部署一:default-http-backend

apiVersion: apps/v1
kind: Deployment
metadata:
  name: default-http-backend
spec:
  selector:
    matchLabels:
      app: default-http-backend
  template:
    metadata:
      labels:
        app: default-http-backend
    spec:
      containers:
      - name: default-http-backend
        image: nginx
        ports:
        - name: http
          containerPort: 80
        imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata:
  name: default-http-backend
spec:
  selector:
    app: default-http-backend
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

部署2:custom-http-backend

apiVersion: apps/v1
kind: Deployment
metadata:
  name: custom-http-backend
spec:
  selector:
    matchLabels:
      app: custom-http-backend
  template:
    metadata:
      labels:
        app: custom-http-backend
    spec:
      containers:
      - name: custom-http-backend
        image: inanimate/echo-server
        ports:
        - name: http
          containerPort: 8080
        imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata:
  name: custom-http-backend
spec:
  selector:
    app: custom-http-backend
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

【讨论】:

【参考方案2】:

我已经复制了你的场景,这对我有用。 我将尝试按照我所遵循的步骤指导您。

云提供商:GKE Kubernetes 版本:v1.15.3 命名空间default

我正在使用 2 个映像的 2 个部署,每个部署一个服务。

服务 1default-http-backend - 使用 nginx 映像,它将是我们的默认后端。

服务 2custom-http-backend - 带有 inanimate/echo-server 图像,如果请求来自列入白名单的 ip,将显示此服务。

入口:带有注释的 Nginx 入口。

预期行为: Ingress 将被配置为使用 default-backend、custom-http-errors 和 whitelist-source-range 注释。如果请求来自白名单 IP,入口将重定向到 custom-http-backend,否则将重定向到 default-http-backend

部署一:default-http-backend

用这个内容创建一个文件default-http-backend.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: default-http-backend
spec:
  selector:
    matchLabels:
      app: default-http-backend
  template:
    metadata:
      labels:
        app: default-http-backend
    spec:
      containers:
      - name: default-http-backend
        image: nginx
        ports:
        - name: http
          containerPort: 80
        imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata:
  name: default-http-backend
spec:
  selector:
    app: default-http-backend
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

应用yaml文件:k apply -f default-http-backend.yaml

部署2:custom-http-backend

使用此内容创建一个文件custom-http-backend.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: custom-http-backend
spec:
  selector:
    matchLabels:
      app: custom-http-backend
  template:
    metadata:
      labels:
        app: custom-http-backend
    spec:
      containers:
      - name: custom-http-backend
        image: inanimate/echo-server
        ports:
        - name: http
          containerPort: 8080
        imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata:
  name: custom-http-backend
spec:
  selector:
    app: custom-http-backend
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

应用yaml文件:k apply -f custom-http-backend.yaml

检查服务是否启动并运行

我将别名 k 用于 kubectl

➜  ~ k get svc                                 
NAME                   TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
custom-http-backend    ClusterIP   10.125.5.227   <none>        80/TCP    73s
default-http-backend   ClusterIP   10.125.9.218   <none>        80/TCP    5m41s
...
➜  ~ k get pods
NAME                                    READY   STATUS    RESTARTS   AGE
custom-http-backend-67844fb65d-k2mwl    1/1     Running   0          2m10s
default-http-backend-5485f569bd-fkd6f   1/1     Running   0          6m39s
...

您可以使用port-forward 测试服务:

默认-http-后端 k port-forward svc/default-http-backend 8080:80 尝试在浏览器中访问http://localhost:8080 以查看 nginx 默认页面。

自定义http后端 k port-forward svc/custom-http-backend 8080:80 尝试在浏览器中访问http://localhost:8080 以查看 echo-server 图像提供的自定义页面。

入口配置

此时我们已经启动并运行了两个服务,我们需要安装和配置 nginx 入口。可以关注official documentation,这里不再赘述。

安装后让我们部署入口,根据您发布的代码我做了一些修改:tls 删除,添加其他域并删除路径 /api 仅用于测试目的,并将我的家庭 IP 添加到白名单。

使用内容创建一个文件my-app-ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-app-ingress
  namespace: default
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: "/"
    nginx.ingress.kubernetes.io/custom-http-errors: '403'
    nginx.ingress.kubernetes.io/default-backend: default-http-backend
    nginx.ingress.kubernetes.io/whitelist-source-range: 207.34.xxx.xx/32
spec:
  rules:
  - host: myapp.rabello.me
    http:
      paths:
      - path: "/"
        backend:
          serviceName: custom-http-backend
          servicePort: 80

应用规范:k apply -f my-app-ingress.yaml

使用命令检查入口:

➜  ~ k get ing
NAME             HOSTS              ADDRESS          PORTS   AGE
my-app-ingress   myapp.rabello.me   146.148.xx.xxx   80      36m

就是这样!

如果我在家里使用我的白名单 ip 进行测试,则会显示自定义页面,但如果我尝试在 4G 网络中使用手机访问,则会显示 nginx 默认页面。

注意我在同一个命名空间中使用入口和服务,如果你需要使用不同的命名空间,你需要使用ExternalName。

希望对你有帮助!

参考资料: kubernetes deployments

kubernetes service

nginx ingress

nginx annotations

【讨论】:

我已经放弃了一段时间。没有时间仔细检查,但我可能有旧版本的 nginx,这可能是我的问题github.com/kubernetes/ingress-nginx/issues/4576【参考方案3】:

您需要创建和部署自定义默认后端,这将返回自定义错误页面。按照doc 部署自定义默认后端并通过修改部署 yaml 来配置 nginx 入口控制器以使用此自定义默认后端。

自定义默认后端的部署yaml为here,源代码为here。

【讨论】:

以上是关于如何在curl中设置自定义的HTTP头的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ActionBar 标题中设置自定义字体?

如何在 iOS 中设置自定义属性? [复制]

如何在 alamofire 5.0.2 版本中设置自定义超时

如何在 djangocms 中设置自定义模板

如何在 UIIMagePickerController 中设置自定义图像

如何在html拖放中设置自定义数据