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 / 1165053
Accepted
TRiG
TRiG
Asked: 2024-09-10 21:36:22 +0800 CST2024-09-10 21:36:22 +0800 CST 2024-09-10 21:36:22 +0800 CST

Na configuração do Apache, os redirecionamentos ou as regras de reescrita têm precedência?

  • 772

Quero que um domínio no Apache exista puramente como um redirecionamento. Para esse fim, crio /etc/apache2/sites-available/redirect.example.info.confo seguinte:

<VirtualHost *:80>
    ServerName redirect.example.info
    ServerAdmin webmaster@localhost
    Redirect / https://example.com/

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Quando executo certbot --apache, isso é reescrito para:

<VirtualHost *:80>
    ServerName redirect.example.info
    ServerAdmin webmaster@localhost
    Redirect / https://example.com/

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

RewriteEngine on
RewriteCond %{SERVER_NAME} =redirect.example.info
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

E um novo arquivo /etc/apache2/sites-available/redirect.example.info-le-ssl.confé criado:

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName redirect.example.info
    ServerAdmin webmaster@localhost
    Redirect / https://example.com/

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

SSLCertificateFile /etc/letsencrypt/live/ca-webs.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/ca-webs.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

Isso funciona como desejado. Os redirecionamentos são executados http://redirect.example.info→ https://redirect.example.info→ https://example.com. Mas não é óbvio para mim como está funcionando. O arquivo reescrito tem um Redirectcomando e um RewriteRulecomando, e eu pensei que o Redirect(vindo primeiro) teria precedência. Como esse arquivo é realmente avaliado?

apache2
  • 1 1 respostas
  • 25 Views

1 respostas

  • Voted
  1. Best Answer
    HBruijn
    2024-09-10T23:50:28+08:002024-09-10T23:50:28+08:00

    AFAIK certbot --apachenão faz um exame rigoroso do HTTP VirtualHost existente, ele simplesmente copia todas as diretivas existentes e adiciona diretivas TLS para gerar um novo HTTPS VirtualHost.
    O HTTP VirtualHost simples é então modificado para incluir um redirecionamento condicional HTTP --> HTTPS (para redirecionar apenas URIs para os quais o certbot configurou um certificado).

    A configuração resultante é adequada para a maioria dos casos de uso, mas no seu caso o resultado é subótimo e eu sugeriria que você editasse manualmente o HTTP Virtual Host simples. Remova as Rewrite*diretivas que o certbot adicionou e reverta para sua configuração original que envia visitantes diretamente de http://redirect.example.info para https://example.compara evitar aquela visita intermediária redundante para https://redirect.example.info.


    Quanto ao motivo pelo qual as Rewrite*diretivas têm precedência, embora apareçam depois da Redirectdiretiva: isso ocorre porque a configuração efetiva do httpd do Apache não é somente o resultado de onde, em qual ordem e em qual contêiner as diretivas de configuração são colocadas e agrupadas, mas também depende de qual(is) módulo(s) as diretivas pertencem.

    Essa informação não é imediatamente óbvia na seção "mesclagem" do manual https://httpd.apache.org/docs/current/sections.html#merging

    Relação entre módulos e seções de configuração

    Uma questão que frequentemente surge após ler como as seções de configuração são mescladas está relacionada a como e quando as diretivas de módulos específicos como mod_rewrite são processadas. A resposta não é trivial e precisa de um pouco de contexto. Cada módulo httpd gerencia sua própria configuração, e cada uma de suas diretivas especifica httpd.confuma parte da configuração em um contexto particular. O httpd não executa um comando enquanto ele é lido.

    No tempo de execução, o núcleo do httpd itera sobre as seções de configuração definidas na ordem descrita acima para determinar quais se aplicam à solicitação atual. Quando a primeira seção corresponde, ela é considerada a configuração atual para esta solicitação. Se uma seção subsequente também corresponder, cada módulo com uma diretiva em qualquer uma das seções tem a chance de mesclar sua configuração entre as duas seções. O resultado é uma terceira configuração, e o processo continua até que todas as seções de configuração sejam avaliadas.

    Após a etapa acima, o processamento "real" da solicitação HTTP começa: cada módulo tem a chance de executar e realizar quaisquer tarefas que desejar. Eles podem recuperar sua própria configuração final mesclada do núcleo do httpd para determinar como devem agir.

    Para mod_rewrite o detalhe sutil provavelmente está na frase "cada módulo tem uma chance de executar e realizar quaisquer tarefas que eles gostem" .
    Os módulos podem/devem se registrar por meio de ganchos de processamento de solicitação para serem capazes de "fazer o que eles gostam" no momento certo e mod_rewrite usa isso para vir primeiro (ou pelo menos mais cedo) com o APR_HOOK_FIRSTgancho https://github.com/apache/httpd/blob/c72b74ccef72fb56becd55888a3aa783c4ab5b6b/modules/mappers/mod_rewrite.c#L5702

    Até onde eu sei, é assim que Rewrite*as diretivas ganham precedência sobre as outras, independentemente de como/onde essas outras diretivas são ordenadas.

    Você pode obter insights sobre os ganchos e todos os módulos habilitados e sua ordenação habilitando mod_info (não se esqueça de adicionar ACLs à URL server-info).

    • 0

relate perguntas

  • Acessando o servidor web do servidor na rede local com seu endereço IP local

  • Como posso encaminhar solicitações do meu servidor web?

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