Não é possível descobrir uma regra de htaccess

9

Eu tenho isso no meu htaccess, mas não consigo descobrir para que serve. Devido à natureza da regra, a pesquisa também não ajuda.

RewriteCond %{REQUEST_URI} !(/$|\.)
RewriteRule (.*) %{REQUEST_URI}/ [R=301]

Alguém por favor pode explicar para que serve?

Richard1984
fonte
Se a parte da solicitação (a parte da URL após ".com") não terminar com /ae não contiver " .", redirecione a solicitação anexando-a com a /. A intenção provável desta regra é manipular a indexação automática de diretórios.
peterh - Restabelece Monica 19/03/19

Respostas:

11

Tudo o que essa regra faz é adicionar um final /aos seus URLS, se não houver nenhum e se não houver .no URI, https://example.org/testserá redirecionado para https://example.org/test/, mas https://example.org/test.htmlnão será reescrito para https://example.org/test.html/(mas note: https://example.org/test.case/foldertambém não será redirecionado para https://example.org/test.case/folder/, pois contém a .no URI).

## Do the following if the URI does not end with `/` or  does not contain an `.`: 
## the . is relevant for file names like test.html, which should n 
RewriteCond %{REQUEST_URI} !(/$|\.)

## Redirect it to the original URI with an added `/` and mark this as permanent:
RewriteRule (.*) %{REQUEST_URI}/ [R=301]
Sven
fonte
" /test.case/foldertambém não será redirecionado" - Ponto secundário, mas se "pasta" for um diretório do sistema de arquivos, o mod_dir emitirá (por padrão) um redirecionamento 301 para acrescentar uma barra final. É apenas um problema, se é /test.case/some-other-virtual-urlque deve ter uma barra final.
MrWhite 25/02/19
6

Sem validar, mas usando minha experiência em reescrita do Apache, essa configuração parece:

  1. Faça a correspondência na parte 'path' do URI (não nos parâmetros do servidor, porta ou consulta), por exemplo '/my/location/file.html'.
  2. Corresponder se esta parte não terminar em um caractere '/' (barra), ou- não incluirá um '.' caractere (ponto).
  3. Use a parte do caminho completo do URI e acrescente uma barra para ele.
  4. Envie um redirecionamento HTTP 301 (permanente) para direcionar o navegador para esse novo URI.

Isso resultará nos seguintes casos de teste

/ -> / /test -> /test/ /my/resource -> /my/resource/ /my/resource.type -> /my/resource.type /edge.case/resource -> /edge.case/resource

Então, acho que a regra tem o objetivo de adicionar barras a recursos que não parecem ser um arquivo, mas parecem ter um caso de vantagem.

Se não estiver adicionando uma barra a um recurso com '.' (ponto) na parte que não é do arquivo, a expressão regular deve ser alterada para:

# match paths which do not end with a slash, or do not resemble a file with an extension
RewriteCond %{REQUEST_URI} !(/$|\.[^/]+$)
# redirect permanently to the same uri with a slash
RewriteRule (.*) %{REQUEST_URI}/ [R=301]
Joffrey
fonte
!(\/$|\.[^\/]*)- O seu regex atualizado não é realmente diferente. Você precisa de uma âncora de fim de cadeia na segunda parte (que corresponda à extensão) também. Talvez algo como: !(/|\.[a-zA-Z]+)$(não há necessidade de escapar das barras).
MrWhite 23/02/19
@MrWhite Good catch! Eu atualizei minha resposta!
23419 Joffrey