AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 986761
Accepted
TRiG
TRiG
Asked: 2019-10-05 02:31:27 +0800 CST2019-10-05 02:31:27 +0800 CST 2019-10-05 02:31:27 +0800 CST

Por que $_SERVER['HTTP_HOST'] às vezes é example.com e às vezes example.com:443?

  • 772

Este é um servidor Ubuntu rodando PHP 7 no Apache, com um site que impõe TLS (usando a porta padrão). No meu entender, https://example.come https://example.com:443são exatamente equivalentes (e, de fato, no meu navegador o número da porta desaparece da barra de endereços quando eu digito). E, no entanto, HTTP_HOST geralmente contém apenas o nome do domínio, mas às vezes também contém o número da porta. Isso pode ser para visitantes de bots (não analisei logs), mas mesmo assim não vejo como. Existe alguma diferença real?

(Isso está causando alguns problemas, pois alguns de nossos logs e filas de trabalho e cache do lado do servidor são separados por HTTP_HOST, portanto, ter o mesmo relatório de site em diferentes hosts é confuso.)

php
  • 1 1 respostas
  • 5871 Views

1 respostas

  • Voted
  1. Best Answer
    Michael Hampton
    2019-10-05T07:06:41+08:002019-10-05T07:06:41+08:00

    A documentação do PHP afirma que $_SERVER['HTTP_HOST']é:

    Conteúdo do Host: cabeçalho da solicitação atual, se houver.

    De fato, cada variável nesse array associativo cuja chave começa com a string HTTP_é uma cópia da variável de solicitação HTTP correspondente enviada pelo agente do usuário.

    Então, por que às vezes contém o nome do host e às vezes contém o nome do host e o número da porta?

    Acontece que ambas as sintaxes são legais e equivalentes. O número da porta é obrigatório se o servidor usar uma porta não padrão, mas é opcional caso contrário.

    Em que circunstâncias um agente de usuário enviaria o número da porta mesmo quando fosse o padrão?

    A seção 5.4 da RFC 7230 explica que o valor do cabeçalho Host: é uma cópia exata do componente de autoridade do URI.

    Se o URI de destino incluir um componente de autoridade, um cliente DEVE enviar um valor de campo para Host que seja idêntico a esse componente de autoridade, excluindo qualquer subcomponente userinfo e seu delimitador "@". . .

    Qual é o componente de autoridade?

    Isso vem da definição de um URI na RFC 3986 seção 3.2 , que explica que são as informações do usuário (nome de usuário e senha), host e porta. Ele explica que a porta DEVE ser omitida se for a porta padrão, mas DEVE não ser igual a DEVE. (Veja RFC 2119. )

    Portanto, para juntar tudo isso, espera-se que um agente do usuário envie o número da porta no cabeçalho Host: se ele também aparecer no URI. Assim, se o agente do usuário tiver a URL https://example.com:443/robots.txt, ele terá um cabeçalho Host: example.com:443. Como o agente do usuário obteve tal URL, não há como saber. Ele pode ter sido enviado pelo seu aplicativo ou pode ter sido construído pelo agente do usuário.

    A seção 2.7.3 da RFC 7230 explica a normalização de URL que, neste caso, indica que uma URL que não contém número de porta e uma URL que contém o número de porta padrão são equivalentes.


    TL;DR: Seu aplicativo deve esperar que um número de porta apareça neste cabeçalho e tratá-lo de alguma forma apropriada ao contexto em que é usado.

    Você pode considerar usar $_SERVER['SERVER_NAME'], que contém o valor da ServerNamediretiva no Apache <VirtualHost>que processou a solicitação (ou, para nginx, a primeira server_nameno serverbloco).

    • 5

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve