$ _SERVER ['REQUEST_METHOD']是否保证是大写的?

cal*_*lum 12 php

我现在已经进入strtoupper($_SERVER['REQUEST_METHOD'])了我的代码.

但这是strtoupper必要的电话吗?为$_SERVER['REQUEST_METHOD']保证被已经是大写吗?

Mar*_*ery 13

简短的回答:不,它不能保证,但通常接收非大写的HTTP方法意味着客户端违反了规范.

答案很长:

如果你正在处理W3规范定义的方法,比如GET和POST,那么你可以保证符合规范的客户端会以大写形式发送它们.这是因为HTTP方法定义为区分大小写 ...

Method标记指示要对Request-URI标识的资源执行的方法.该方法区分大小写.

并且WITS定义的方法如OPTIONS,GET,POST等以大写形式定义.

但是,如果您正在处理不符合规范的客户端,那么您的Web服务器和PHP都不会神奇地强制$_SERVER['REQUEST_METHOD']为您提供大写的值.这可以通过像这样的简单脚本轻松演示......

<?php
    echo "The method used by your request was $_SERVER[REQUEST_METHOD]";
?>
Run Code Online (Sandbox Code Playgroud)

如果我们使用方法不是大写的HTTP请求命中该脚本,它将以非大写形式回显该方法.许多常用工具将让我们这样做.例如,让我们从UNIX shell中点击它:

$ curl http://localhost/echo_method.php -X GET -w "\n"
The method used by your request was GET
$ curl http://localhost/echo_method.php -X gEt -w "\n"
The method used by your request was gEt
$ curl http://localhost/echo_method.php -X fWoRbLeWoRbLe -w "\n"
The method used by your request was fWoRbLeWoRbLe
Run Code Online (Sandbox Code Playgroud)

...或使用Python:

>>> import httplib
>>> connection = httplib.HTTPConnection('localhost')
>>> connection.request('pOsT', '/echo_method.php')
>>> connection.getresponse().read()
'The method used by your request was pOsT'
Run Code Online (Sandbox Code Playgroud)

"好吧",您可能会说,"因此,如果我的API被编写糟糕的脚本或本机应用程序使用,则存在潜在问题.但我的API仅由在Web浏览器中运行的JavaScript触发的AJAX调用使用.问题影响我?"

不幸的是,是的.似乎现代浏览器在发送AJAX时将大多数标准HTTP方法强制为大写,但目前对于自定义HTTP方法或者特别是PATCH方法不这样做.

从以前点击相同的PHP脚本,这次是在Chrome JavaScript控制台...

var request;
request = new XMLHttpRequest();
request.open("GeT", "http://localhost/echo_method.php", true);
request.send();
request.onreadystatechange = function() {
    if (request.readyState == 4) {
        console.log(request.responseText);
    }
}
Run Code Online (Sandbox Code Playgroud)

产生结果

The method used by your request was GET 
Run Code Online (Sandbox Code Playgroud)

但改变HTTP方法pATcH给我们

var request;
request = new XMLHttpRequest();
request.open("pATcH", "http://localhost/echo_method.php", true);
request.send();
request.onreadystatechange = function() {
    if (request.readyState == 4) {
        console.log(request.responseText);
    }
}
Run Code Online (Sandbox Code Playgroud)

给我们

The method used by your request was pATcH
Run Code Online (Sandbox Code Playgroud)

更糟糕的是,Web浏览器并不是唯一能够将除PATCH方法之外的所有方法强制转换为大写的客户端.

总结:虽然HTTP规范要求请求包含大写的HTTP方法(除非它是在不同情况下专门定义的自定义方法),但是常见的Web工具使得前端开发人员很容易弄错,并且PHP的$_SERVER['REQUEST_METHOD']变量也是如此会不会奇迹般地强迫如果他们这样做,以大写为您的方法.

当然,这取决于您是否依赖于您的客户遵守规范,验证方法是否为大写并使用适当的状态代码(可能是400或405)进行响应,如果不是,则回复错误消息,或者接受错误通过strtoupper($_SERVER['REQUEST_METHOD'])像这里的问题提问者一样强迫方法使自己成为大写的基于HTTP的方法.


str*_*kol 5

RFC 3875REQUEST_METHOD变量定义为大写,因此可以依靠它。

REQUEST_METHOD元变量必须设置为脚本应使用的方法来处理请求...

  REQUEST_METHOD   = method
  method           = "GET" | "POST" | "HEAD" | extension-method
  extension-method = "PUT" | "DELETE" | token
Run Code Online (Sandbox Code Playgroud)

该方法区分大小写。