[如果有人通过http(即不是https)访问我的服务器,那么我会将GET请求重定向到https版本。
但是我不知道如何处理POST和PUT,因为我无法重定向它们(我相信浏览器会在重定向时执行GET)。
我应该返回错误代码。 我应该返回什么HTTP错误代码?
http://www.ietf.org/id/draft-ietf-httpbis-p2-semantics-18.txt解释HTTP响应代码。如果您想输入错误代码,如果无法通过该URL处理请求,则只需返回404。
7.4.5。找不到404
服务器未找到与有效请求URI匹配的任何内容。没有迹象表明这种情况是暂时的还是暂时的常驻。如果服务器使用410(消失)状态代码通过某种内部可配置的机制知道一个旧的资源永久不可用,并且没有转发地址。当服务器不想执行此操作时,通常使用此状态代码确切说明请求被拒绝的原因,或者没有其他原因回复适用。
[通常,您将返回403-禁止。对此的一般描述是“服务器理解了请求,但拒绝授权它。”这将适合您的情况。
技术上正确的答案是使用403.4,但在子状态下,它是仅IIS的功能,nginx不支持它。
所以我更愿意返回418“我是茶壶”或451“由于法律原因不可用”(因为使用纯文本http已经不再合法了,哈哈,只是在开玩笑:)),这种状态很奇怪并应触发客户端弄清楚发生了什么。
nginx具有返回状态的选项,如文本
# cat /etc/nginx/conf.d/default.conf
server {
listen 80 default_server;
location / {
add_header Content-Type text/plain;
return 418 "TLS REQUIRED";
}
}
# curl -v http://localhost/
* About to connect() to localhost port 80 (#0)
* Trying ::1...
* Connection refused
* Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: localhost
> Accept: */*
>
< HTTP/1.1 418
< Server: nginx/1.16.1
< Date: Sat, 15 Feb 2020 07:13:20 GMT
< Content-Type: application/octet-stream
< Content-Length: 12
< Connection: keep-alive
<
* Connection #0 to host localhost left intact
TLS REQUIRED
但是,Chrome或Firefox之类的浏览器无法处理此权限,Chrome表示ERR_INVALID_RESPONSE,而Firefox则显示“未找到文件”,并且这种行为无法解决我们的目标。
所以我只剩下状态418。