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 / 1154115
Accepted
KBM
KBM
Asked: 2024-02-23 02:39:10 +0800 CST2024-02-23 02:39:10 +0800 CST 2024-02-23 02:39:10 +0800 CST

Criar um .htaccess em um subdiretório faz com que regras de reescrita em .htaccess de nível superior parem de funcionar

  • 772

Desculpe se isso já foi perguntado/respondido antes, mas não consegui encontrar uma resposta para esse problema específico.

Se eu criar um arquivo .htaccess com uma regra de reescrita simples, essa regra funcionará. Se eu criar outro arquivo .htaccess em um subdiretório com sua própria configuração de reescrita, o arquivo .htaccess principal no nível superior deixará de ser lido. Eu nem preciso criar nenhuma regra. Simplesmente ativar o mecanismo de reescrita no subdiretório faz com que as reescritas de nível superior parem de funcionar.

Criei um conjunto de subdiretórios com dois arquivos de texto:

[root@apachetest html]# cat test/1/test.txt
1

[root@apachetest html]# cat test/2/test.txt
2

E um arquivo .htaccess para reescrever test/1/test.txt para test/2/test.txt

[root@apachetest html]# cat test/.htaccess 
RewriteEngine on
RewriteRule 1/test.txt 2/test.txt [L]

Isso funciona conforme o esperado. Se eu solicitar 1/test.txt, recebo 2/test.txt

[root@apachetest html]# curl localhost/test/1/test.txt
2

Mas se eu criar outro arquivo .htaccess dentro do subdiretório test/1/, o arquivo test/.htaccess para de funcionar.

[root@apachetest html]# echo "RewriteEngine On" > test/1/.htaccess
[root@apachetest html]# curl localhost/test/1/test.txt
1

Eu tentei todas as RewriteOptions; Inherit, InheritBefore, InheritDown, InheritDownBefore e IgnoreInherit em /test/.htaccess e /test/1/.htaccess, mas não consigo fazer com que /test/.htaccess RewriteRule funcione se /test/1/.htaccess tem alguma configuração de reescrita nele.

Preciso poder colocar RewriteRules no subdiretório sem afetar o RewriteRules no diretório de nível superior. Alguém pode me dizer o que estou perdendo?

.htaccess
  • 1 1 respostas
  • 24 Views

1 respostas

  • Voted
  1. Best Answer
    MrWhite
    2024-02-23T04:32:24+08:002024-02-23T04:32:24+08:00

    Sim, por padrão, as diretivas mod_rewrite não são herdadas pelas configurações filhas. Portanto, se você tiver diretivas mod_rewrite em um .htaccessarquivo de subdiretório (mesmo que apenas habilite ou desabilite o mecanismo de reescrita), as diretivas mod_rewrite no diretório pai/config serão completamente substituídas - elas não serão processadas.

    Eu tentei todas as RewriteOptions; Herdar, HerdarBefore, HerdarDown, HerdarDownBefore, ...

    Sim, é isso que você precisa fazer para habilitar a herança mod_rewrite. A opção escolhida depende de onde e quando você deseja que as diretivas pai/filho sejam herdadas.

    NO ENTANTO, o "problema" é a maneira como as diretivas mod_rewrite são "herdadas". Eles são herdados copiando efetivamente as diretivas na respectiva configuração. Eles não são processados ​​no contexto da configuração original. Isso afeta coisas como caminhos de URL relativos. Normalmente, a RewriteRulediretiva corresponde a um caminho de URL relativo ao diretório que contém o .htaccessarquivo. No entanto, se essas diretivas forem "herdadas" (ou seja, efetivamente copiadas) em uma configuração filha, esses caminhos de URL relativos serão diferentes e a regra poderá não corresponder mais.

    As diretivas "herdadas" precisam ser escritas de forma que não dependam do diretório no qual são processadas - portanto, você não pode necessariamente confiar no RewriteRule padrão ao herdar diretivas em um contexto de diretório .

    Então, usando seu exemplo...

    # test/.htaccess 
    RewriteEngine on
    RewriteRule 1/test.txt 2/test.txt [L]
    

    E habilitamos a herança mod_rewrite no arquivo /test/1do subdiretório .htaccess:

    # test/1/.htaccess 
    RewriteEngine on
    
    RewriteOptions Inherit
    

    Isso efetivamente resulta no seguinte processamento ao solicitar /test/1/test.txt:

    # test/1/.htaccess 
    RewriteEngine on
    
    RewriteOptions Inherit
    
    # Due to "Inherit" option the inherited directives from the parent config
    # are effectively copied in-place after the existing directives...
    RewriteRule 1/test.txt 2/test.txt [L]
    

    Claramente, o RewriteRule padrão 1/test.txt no test/1/.htaccessarquivo nunca corresponderá, então a regra não faz nada. (A regra precisaria ser modificada para corresponder a just test.txt, mas a substituição também precisaria ser modificada, caso contrário, reescreveria a solicitação para /test/1/2/test.txt- o que não existe.)

    As diretivas na configuração herdada/pai precisariam ser modificadas para evitar a dependência do diretório no qual o pai .htaccessestá localizado. Por exemplo:

    # test/.htaccess 
    RewriteEngine on
    RewriteCond %{REQUEST_URI} ^/([^/]+)/1/test\.txt$
    RewriteRule (^|/)test\.txt$ /%1/2/test.txt [L]
    

    A condição repete efetivamente o teste para test.txt, mas é mais específica. Você poderia tornar o RewriteRule padrão totalmente genérico, mas a regra será processada para cada solicitação.

    NB: Capturei o primeiro segmento do caminho e usei a referência anterior correspondente %1na substituição para evitar a necessidade de codificar o diretório no qual o .htaccessarquivo está localizado.

    Este modal de "herança" é mais problemático/complexo quando mod_rewrite é usado em um contexto de diretório ( .htaccess). (mod_rewrite geralmente é mais complexo quando usado em um contexto de diretório .) O problema do caminho relativo não é um problema com as diretivas na configuração do servidor/virtualhost, pois os caminhos são todos relativos à raiz.

    • 1

relate perguntas

  • Como obter o Apache2 para redirecionar para um subdiretório

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