Si usted return 301 https://$host$request_uri;
es la respuesta predeterminada en el puerto 80, su servidor tarde o temprano puede obtener una lista de proxies abiertos [1] y comenzar a ser abusado para enviar tráfico a otra parte de Internet. Si sus registros se llenan de mensajes como este, entonces sabe que le ha sucedido:
42.232.104.114 - - [25/Mar/2018:04:50:49 +0000] "GET http://www.ioffer.com/i/new-fashion-fine-gold-bracelet-versaec-bracelet-641175733 HTTP/1.1" 301 185 "http://www.ioffer.com/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Hotbar 4.1.8.0; RogueCleaner; Alexa Toolbar)"
El problema es que $host
repetirá lo que el navegador envíe en el Host
encabezado o incluso el nombre de host de la línea de apertura de HTTP, como esta:
GET http://www.ioffer.com/i/new-fashion-fine-gold-bracelet-versaec-bracelet-641175733 HTTP/1.1
Debido a ese problema, algunas otras respuestas aquí recomiendan usar en $server_name
lugar de $host
. $server_name
siempre evalúa lo que pones en la server_name
declaración. Pero si tiene varios subdominios allí o usa un comodín, eso no funcionará, ya que $server_name
solo usa la primera entrada después de la server_name
declaración y, lo que es más importante, solo hará eco de un comodín (no lo expandirá).
Entonces, ¿cómo soportar múltiples dominios manteniendo la seguridad? En mis propios sistemas, he lidiado con este dilema enumerando primero un default_server
bloque que no se usa $host
y luego enumerando un bloque comodín que sí:
server {
listen 80 default_server;
server_name example.com;
return 301 https://example.com$request_uri;
}
server {
listen 80;
server_name *.example.com;
return 301 https://$host$request_uri;
}
(También puede enumerar más de un dominio en el segundo bloque).
Con esa combinación, los dominios incomparables serán redirigidos a algún lugar codificado (siempre example.com
), y los dominios que coincidan con los suyos irán al lugar correcto. Su servidor no será útil como proxy abierto, por lo que no atraerá problemas.
Si se siente mal, supongo que también podría hacer que el default_server
bloqueo no coincida con ninguno de sus dominios legítimos y sirva para algo ofensivo. . . .
[1] Técnicamente "proxy" es la palabra incorrecta, porque su servidor no está saliendo y cumpliendo con las solicitudes de los clientes, simplemente enviando una redirección, pero no estoy seguro de cuál sería la palabra correcta. Tampoco estoy seguro de cuál es el objetivo, pero llena sus registros con ruido y consume su CPU y ancho de banda, por lo que también podría detenerlo.