Prefácio
Primeiramente: Uma simples reescrita da porta 80 -> porta 443 NÃO corrigirá isso. Em quase todas as perguntas anteriores, discussão por e-mail, discussão no fórum etc., descobri que essa foi a primeira resposta ignorante e foi repetida várias vezes.
Segundo: Sim, eu sei que você não pode servir tráfego HTTP e HTTPS na mesma porta. Isto não é isso.
Cenário:
Servidor Apache hospedando vários sites via multiplicação de portas. A porta 80 serve um site público. A porta 443 serve a versão segura desse site.
As portas 7443, 8443 e 9443 servem cada site separado protegido por SSL.
Se um usuário digitar incorretamente o URL ou receber um link inválido, diga http: //hostname.tld: 7443 , ele receberá a seguinte página ridícula:
Em vez de o servidor apenas os redirecionar para https: //hostname.tld: 7443 .
Minha pergunta é: como, em nome do buraco do Zeus, você pode modificar o comportamento do Apache ou esta mensagem de erro para redirecionar o usuário automaticamente?
O Apache está obviamente atendendo a uma solicitação não https (para exibir essa mensagem de erro), mesmo que esteja configurado para HTTPS. Parece-me incrivelmente estúpido não apenas fazer o redirecionamento por padrão, mas posso entender por que eles foram com o comportamento que fizeram, mesmo que eu não concorde. Então, minha pergunta é: você pode mudar isso? Eles estão lidando com o erro EM ALGUM LUGAR E, com o Apache sendo a cornucópia de configuração que é, é lógico que exista alguma diretiva em algum lugar para lidar com esse comportamento, mas não consegui encontrá-lo em várias horas de ajustes até agora.
Atualizar:
Eu tentei várias coisas, incluindo:
usando
ErrorDocument 400
diretivas para obter um script CGI e PHP que apenas enviaStatus 301
eLocation
cabeçalhos. Isso resulta em uma página em branco. UsarErrorDocument 400 https://hostname.tld:7443
simplesmente resulta na exibição desse link na página.O uso de quase todas as combinações entre
mod_rewrite
eu ou o Google pode ser feito, incluindo declarações gerais que direcionam o site inteiramente; estes nunca funcionam. Literalmente, eles não fazem nada. Estou supondo que o Apache esteja chutando o erro acima antes mesmo de tentar processar as diretivas de reescrita.
Não posso usar redirecionamentos baseados em porta, devido ao uso personalizado da porta. Não posso usar redirecionamentos baseados em script porque eles nunca são exibidos devido à incompatibilidade http / https. Estou quase disposto a atribuir isso a um bug ou a um comportamento não intencional, mas alguém teve a intenção de colocar uma mensagem de erro muito personalizada lá, não se incomodou em pensar que talvez você queira apenas ir ao mercado URL que eles já estão fornecendo ?
fonte
Respostas:
Eu acho que isso é provavelmente um bug na forma como o Apache 2.2 e inferior lida com essa circunstância específica.
Parece que em um
400 Bad Request
erro de leitura SSL , o Apache 2.2 não retorna o código de resposta HTTP ou os cabeçalhos, apenas o corpo da resposta HTTP. Eu testo telnetando para a porta 443 e enviando:O servidor retorna imediatamente (para mim):
Observe a falta de um código de resposta HTTP ou de qualquer cabeçalho HTTP.
Quando faço isso em um servidor Apache 2.4, recebo:
Se eu configurar uma linha ErrorDocument como você:
Então eu recebo o HTML para um redirecionamento 302, mas, novamente, nenhum dos cabeçalhos. Sem o código de resposta de redirecionamento 302 e o
Location:
cabeçalho, o navegador não redirecionará.Tente atualizar para o Apache 2.4 e veja se funciona. Eu testei e confirmei com pelo menos o Apache 2.4.3, mas não fiz o esforço de descobrir exatamente quando esse comportamento foi atualizado. Eu suspeito que na grande quantidade de trabalho que eles fizeram na preparação do 2.4, eles corrigiram o comportamento indesejável como efeito colateral.
Erros httpd relevantes do Apache:
ATUALIZAR
Você pode forçar um Apache com erros a fornecer o comportamento que você deseja (o redirecionamento) fazendo com que o script imprima seus cabeçalhos (que não serão enviados ao cliente) e, em seguida, imprima manualmente novamente os cabeçalhos desejados. Aqui está um script Perl básico que funciona no Apache 2.2.22:
Você deve estar ciente de que existem outros motivos pelos quais um 400 pode ser gerado, além de apenas conversar com uma porta SSL sem SSL. A maneira mais fácil de determinar isso é procurar a
HTTPS
variável de ambiente. Se estiver definido, o SSL foi negociado corretamente e outra coisa está causando o 400 (não faça o truque de cabeçalho duplo, se for esse o caso). SeHTTPS
não estiver definido, retorne seu redirecionamento como acima.fonte
<javascript
tag e ter sorte com o redirecionamento de hackers dessa maneira, mas até agora, não dados. Nada sobre este parece ser tratados de uma forma que segue a grandiosidade caso contrário bastante rígida Apache ...Você pode corrigir isso com reescrita mod. Defina uma regra para corresponder a qualquer coisa. Veja esta resposta no Stackoverflow
fonte
sites-available
diretório inteiro . Mesmo se você apenas o redirecionar para bobagem, ou redirecioná-lo para um site diferente, porta diferente etc., ele continuará carregando essa 400 Solicitação inválida.