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 / 1083215
Accepted
alancc
alancc
Asked: 2021-11-11 22:09:17 +0800 CST2021-11-11 22:09:17 +0800 CST 2021-11-11 22:09:17 +0800 CST

Devo escapar da barra '/' no RewriteCond?

  • 772

Se eu preciso escapar da barra '/' em RewriteCond?

Atualmente escrevo a seguinte regra em .htaccess:

RewriteCond %{QUERY_STRING} rp=/knowledgebase/
RewriteRule ^index\.php$ https://www.datanumen.com/knowledgebase/ [QSD,R=301,L,NC]

No entanto, isso só funciona para URL como https://www.datanumen.com/fi/customer/index.php?rp=/knowledgebase/7/How-to-order-the-full-version-of-DataNumen-Access -Repair.html&language=swedish , mas não funciona para URL como https://www.datanumen.com/fi/customer/index.php?rp=%2Fknowledgebase%2F7%2FHow-to-order-the-full-version- of-DataNumen-Access-Repair.html&language=swedish

Então, eu tenho que modificar a regra, conforme abaixo:

RewriteCond %{QUERY_STRING} rp=/knowledgebase/ [OR]
RewriteCond %{QUERY_STRING} rp=%2Fknowledgebase%2F
RewriteRule ^index\.php$ https://www.datanumen.com/knowledgebase/ [QSD,R=301,L,NC]

Mas eu verifiquei https://serverfault.com/a/968916/280923 e disse " A barra (/) não precisa ser escapada ". Então estou confuso.

Se eu precisar levar todas as situações em consideração, ou seja, a versão com escape e a versão sem escape de '/', então deve haver uma combinação totalmente 4, devo adicionar todas elas como o RewriteCond:

rp=/knowledgebase/
rp=%2Fknowledgebase%2F
rp=%2Fknowledgebase/
rp=/knowledgebase%2F
.htaccess mod-rewrite rewritecond
  • 1 1 respostas
  • 1049 Views

1 respostas

  • Voted
  1. Best Answer
    MrWhite
    2021-11-12T07:00:17+08:002021-11-12T07:00:17+08:00

    Devo escapar da barra /em RewriteCond?

    Por "escape the slash", você realmente quer dizer "devo corresponder a uma barra codificada de URL ou não?". Isso depende inteiramente da solicitação HTTP feita ao seu servidor.

    Mas eu verifiquei https://serverfault.com/a/968916/280923 e disse "A barra ( /) não precisa ser escapada". Então estou confuso.

    A pergunta/resposta vinculada não está relacionada ao problema atual. Essa questão está lidando com escapes de barra invertida em diretivas/regex do Apache, não URLs codificados por URL (ou % codificados) com os quais você está lidando aqui. Estes são dois tipos muito diferentes de métodos de "escape" para propósitos diferentes.

    Você está lidando com URLs codificados em %. Como a URL aparece na solicitação HTTP. Diferentes partes de um URL (principalmente o "caminho" e a "sequência de consulta") têm requisitos de codificação diferentes. Se um caractere específico precisa ser codificado em % depende se ele teria um significado especial nesse contexto.

    Conforme definido na RFC3986 , a barra ( /) não precisa ser estritamente codificada em % na parte da string de consulta da URL. No entanto, as funções de codificação de URL (como em PHP e JavaScript) geralmente codificam % esse caractere. (Acho que isso é amplamente histórico, pois algumas implementações antigas supostamente não lidavam com uma barra não codificada corretamente - referência RFC3986 .)

    No entanto, independentemente de um caractere precisar ser codificado em URL (para negar seu significado especial), qualquer caractere pode ser codificado em % e isso deve ser tratado da mesma forma que o caractere literal (não codificado).

    Se você precisa ou não corresponder /(decodificado) ou %2F(codificado) depende se esse caractere está ou não codificado em % na solicitação.

    Seu problema é que a QUERY_STRINGvariável do servidor não é % decodificada, ao contrário do caminho de URL que corresponde ao RewriteRule padrão .

    Mas... você precisa verificar tanto o %-decoded /quanto o %-encoded %2F? Presumivelmente, você está vinculando consistentemente a apenas um ou outro URL (canônico). Portanto, quaisquer solicitações para a URL não canônica teriam que ser digitadas manualmente ou vinculadas erroneamente por terceiros. Você está recebendo pedidos para ambos? Quais são as consequências de não redirecionar o URL não canônico?

    Caso contrário, sim, você precisaria verificar ambos (e potencialmente todas as variações/casos de). Embora isso provavelmente seja apenas /knowledgebase/ou %2Fknowledgebase%2F. Mas observe que pode ser %2F(maiúsculas) ou %2f(minúsculas). Maiúsculas é apenas uma convenção. Ter que verificar uma codificação mista, como %2Fknowledgebase/deve ser muito rara. Mas levado ao extremo, isso também é o mesmo que %2f%6b%6e%6f%77%6c%65%64%67%65%62%61%73%65%2f. A necessidade de lidar com todas essas variações depende da probabilidade de obter tal solicitação e da gravidade da não correspondência da regra.

    Portanto, para corresponder a /knowledgebase/e %2Fknowledgebase%2F(não diferencia maiúsculas de minúsculas), você pode usar algo como:

    RewriteCond %{QUERY_STRING} ^rp=(/|%2[Ff])knowledgebase(/|%2[Ff])
    

    Você pode evitar a classe de caracteres [Ff]e usar o NCsinalizador para tornar toda a comparação insensível a maiúsculas e minúsculas. Por exemplo:

    RewriteCond %{QUERY_STRING} ^rp=(/|%2F)knowledgebase(/|%2F) [NC]
    

    No Apache 2.4, você pode usar a unescape()função em uma expressão do Apache com a RewriteConddiretiva para decodificar a URL QUERY_STRINGantes de fazer a comparação. No entanto, isso realmente não ajuda você, pois não decodifica% as barras, ou seja. %2Fou %2fpermanece conforme a solicitação (mas quaisquer outros caracteres são % decodificados). Por exemplo:

    RewriteCond expr "unescape(%{QUERY_STRING}) =~ m#^rp=(/|%2[Ff])knowledgebase(/|%2[Ff])#"
    

    Isso permitiria que você combinasse rp=%2f%6b%6e%6f%77%6c%65%64%67%65%62%61%73%65%2f.


    Ou, se você não estiver esperando nenhum caractere codificado de URL na string de consulta, poderá simplesmente bloquear qualquer solicitação que envie algum! Por exemplo, o seguinte precisaria ir no topo da sua configuração:

    # Block any request that includes a %-encoded character in the query string
    RewriteCond %{QUERY_STRING} %[\da-f]{2} [NC]
    RewriteRule ^ - [R=400]
    
    • 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