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 / 1140610
Accepted
Michel Zúñiga
Michel Zúñiga
Asked: 2023-08-03 23:06:29 +0800 CST2023-08-03 23:06:29 +0800 CST 2023-08-03 23:06:29 +0800 CST

redirecionamentos htaccess com caracteres especiais em um URL específico não funcionando

  • 772

Preciso de ajuda para criar um redirecionamento, estou tentando substituir tudo -para +, mas ambos são caracteres especiais e também quero fazer isso apenas quando a URL contiver ?s=.

Isto é um exemplo

example.com/?s=i-need-to-rewrite-this-url
example.com/?s=i+need+to+rewrite+this+url

Isso é o que eu tenho, já tentei usar ()ou ""não deu certo

RewriteEngine on
RewriteRule ^?s=(.*)\-(.*)$ ?s=$1\+$2 [L,R=301]

Agradeço qualquer ajuda. Obrigado.

.htaccess
  • 1 1 respostas
  • 21 Views

1 respostas

  • Voted
  1. Best Answer
    MrWhite
    2023-08-04T01:11:21+08:002023-08-04T01:11:21+08:00

    Estou tentando substituir all -por +, mas ambos são caracteres especiais

    Não há nada particularmente "especial" sobre esses personagens. Pelo menos, não no contexto em que serão usados. O -(hífen) é um especificador de intervalo quando usado dentro de uma classe de caractere regex, caso contrário, é apenas um hífen e é seguro usar não codificado na parte da string de consulta da URL (não precisamos usá -lo em uma classe de caractere regex). O +(mais) é um quantificador regex, mas não precisamos usá-lo em um regex, apenas na string de substituição (2º argumento para a RewriteRulediretiva, que não é um regex). O é um espaço+ codificadoquando usado na parte da string de consulta do URL - que eu acho que você conhece e é por isso que você precisa redirecionar a solicitação (embora, como isso faz parte de um valor de parâmetro de URL, também é curioso porque isso não pode ser resolvido em a aplicação).

    Uma coisa a ser observada, no entanto, é que, como +é um espaço codificado em URL , precisamos usar o sinalizador NE( noescape) na RewriteRulediretiva para evitar que mod_rewrite da URL codifique o +as %2B(um literal +) na resposta de redirecionamento. (O mesmo vale para quaisquer outros caracteres codificados em % que possamos capturar do QUERY_STRING- esta variável de servidor não é decodificada em %.)

    RewriteRule ^?s=(.*)\-(.*)$ ?s=$1\+$2 [L,R=301]
    

    O RewriteRule padrão (primeiro argumento) corresponde apenas ao caminho da URL, não à string de consulta. Portanto, uma RewriteRulediretiva sozinha nunca corresponderá à string de consulta. A propósito, ?é um caractere regex especial (0 ou 1 quantificador do token anterior) e ^(o token anterior) não é quantificável, portanto, ficaria surpreso se isso fosse compilado (resultando em um erro interno do servidor 500). Um literal ?em um regex precisa ter uma barra invertida de escape.

    Como mencionado acima, o NEsinalizador seria necessário aqui. E o +não precisa ser escapado com barra invertida na string de substituição , pois não possui nenhum significado especial aqui (não é um regex). Além disso, devido à string de substituição relativa (ou seja, ?s=$1\+$2), a menos que você tenha RewriteBasedefinido, isso resultaria em um redirecionamento malformado.

    Para corresponder à string de consulta, você precisa de uma condição adicional ( RewriteConddiretiva) e corresponder à QUERY_STRINGvariável do servidor. Então, como primeira tentativa, você poderia fazer algo assim:

    # First attempt (inefficient when multiple "-" are present)
    RewriteCond %{QUERY_STRING} ^s=([^&]*)-([^&]*)
    RewriteRule ^$ /?s=%1+%2 [NE,R=301,L]
    

    Observe que as referências anteriores %1e %2(em oposição a $1, etc.) contêm os valores capturados da diretiva CondPattern ( RewriteConddiretiva) anterior, em vez do RewriteRule padrão (que, nesse caso, corresponde apenas à string vazia).

    (NB: você deve sempre testar primeiro com redirecionamentos 302 - temporários - para evitar possíveis problemas de cache e certifique-se de que todos os caches intermediários sejam limpos antes do teste.)

    Estou assumindo sque é o único parâmetro de URL. Com a regra acima, quaisquer outros parâmetros de URL a seguir serão descartados.

    NO ENTANTO , o acima é muito ineficiente, pois aciona um redirecionamento externo para cada instância de -. Portanto, seu exemplo de /?s=i-need-to-rewrite-this-urlacionaria 5 redirecionamentos.

    Solução

    Em vez do acima, você deve substituir recursivamente todos menos um -internamente e apenas acionar o redirecionamento externo (e substituir o último -) depois que todos -forem substituídos. Para isso, precisamos de uma reescrita adicional para realizar as substituições internas. Por exemplo:

    # Internally replace all but the last "-" with "+" in the URL param
    RewriteCond %{QUERY_STRING} ^s=([^&]*-[^&]*){2}
    RewriteCond %{QUERY_STRING} ^s=([^&]*)-([^&]*)
    RewriteRule ^$ ?s=%1+%2 [N=20]
    
    # Replace the last "-" and redirect
    RewriteCond %{QUERY_STRING} ^s=([^&-]*)-([^&-]*)
    RewriteRule ^$ /?s=%1+%2 [NE,R=301,L]
    

    A primeira condição que verifica o regex ^s=([^&]*-[^&]*){2}simplesmente determina que há pelo menos 2 hífens no valor do sparâmetro de URL. (Caso contrário, a regra é ignorada e vai direto para a segunda regra/redirecionamento.) A segunda condição captura as partes relevantes da string de consulta em torno do último -, que são usadas no seguinte RewriteRule.

    O Nsinalizador faz com que o mecanismo de reescrita seja reiniciado imediatamente. O 20define um limite para o número de iterações (Apache 2.4+) - portanto, estou assumindo não mais que 20+1 hífens (o último hífen é substituído na segunda regra/redirecionamento).

    Como sabemos que haverá no máximo 1 hífen restante no parâmetro de URL quando a segunda regra for processada, adicionei o hífen à classe de caractere regex como uma otimização , para evitar retrocessos desnecessários.


    Futuro

    Há uma replacefunção vindo para Apache expressions , que (como o nome sugere) permite que você pesquise/substitua caracteres em uma string, mas não acho que isso tenha sido lançado ainda nas últimas compilações públicas. Mas isso potencialmente permitiria que você fizesse algo como o seguinte em uma única regra:

    RewriteCond %{QUERY_STRING} ^s=[^&]*-
    RewriteCond expr "replace(%{QUERY_STRING},'-','+') =~ /^s=([^&]+)/"
    RewriteRule ^$ /?s=%1 [NE,R=301,L]
    
    • 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