Como posso remover duas partes separadas de um URL usando mod_rewrite?

Como posso remover duas partes separadas de um URL usando mod_rewrite?

Eu tenho este URL infeliz:

dom.tld/library/Photography/index.php?cmd=image&sfpg=2021/*IMG_3468.jpg
dom.tld/library/Photography/index.php?sfpg=2021/*

Isso deve ficar assim

dom.tld/library/Photography/2021/IMG_3468.jpg
dom.tld/library/Photography/2021/

Essencialmente, quero remover index.php?cmd=image&sfpg=o asterisco *antes do nome do arquivo.

A estrutura da pasta fica assim:

root /var/www/domain.tld/main/library/Photography -> tree -a
.
|-- .htaccess
|-- index.php
|-- _GalData
|   |-- info
|   |   |-- 2018
|   |   |   |-- April
|   |   |   |   |-- _sfpg_dir
|   |   |   |   `-- image.png
|   |   |   |-- _sfpg_dir
|   |   |   `-- image.png
|   |   |-- 2019
|   |   |   |-- _sfpg_dir
|   |   |   `-- image.png
|   |   `-- _sfpg_dir
|   `-- thumb
|       |-- 2018
|       |   |-- April
|       |   |   `-- image.jpg
|       |   `-- image.jpg
|       `-- 2019
|           `-- image.jpg
`-- synced
    |-- 2018
    |   |-- April
    |   |   `-- image.jpg
    |   `-- image.jpg
    `-- 2019
        `-- image.jpg

As imagens reais são armazenadas synced/e _GalData/geradas por index.php O site principal reside em/var/www/domain.tld/main/index.html

Responder1

Não tenho 100% de certeza de que esta seja a melhor maneira de fazer isso, mas dada a seguinte estrutura de pastas

user@instance-apache:/var/www/html$ tree -a
.
├── .htaccess
├── index.html
└── library
    └── photography
        └── folder
            └── image.jpg

e este conteúdo do arquivo .htaccess [ATUALIZADA]

RewriteEngine on
RewriteCond %{QUERY_STRING} .*\=(.*)\*(.*)
RewriteRule (.*/)index.php /$1%1%2 [QSD]

apache deve fazer

http://127.0.0.1/library/photography/index.php?cmd=image&sfpg=folder/*image.jpg

em

http://127.0.0.1/library/photography/folder/image.jpg

Responder2

No .htaccessarquivo localizado no subdiretório em /library/photography/.htaccessvocê pode fazer algo como o seguinte usando mod_rewrite para reescrever internamente a solicitação para o URL desejado.

RewriteEngine On

RewriteCond %{QUERY_STRING} (^|&)cmd=image(&|$)
RewriteCond %{QUERY_STRING} (?:^|&)sfpg=([^&*]+)\*([^&]+)(&|$)
RewriteRule ^index\.php$ %1%2 [QSD,L]

O primeirodoença( RewriteConddiretiva) simplesmente confirma que o cmd=imageparâmetro URL está presente em qualquer lugar da string de consulta.

O segundodoençacaptura as partes do sfpgvalor do parâmetro URL em torno do *caractere (que precisa ter escape de barra invertida quando usadoforade uma classe de caracteres regex para negar seu significado especial). Eles ficam então disponíveis nas referências anteriores %1e %2respectivamente e são usados ​​nosubstituiçãostring (2º argumento da RewriteRulediretiva) é construir umrelativocaminho do arquivo (ou seja, relativo ao /library/photography/subdiretório que contém o .htaccessarquivo).

Esses parâmetros de URL podem aparecer em qualquer ordem. por exemplo. ?sfpg=folder/*image.jpg&cmd=imagetambém combinaria com sucesso. E pode haver parâmetros de URL adicionais, que são descartados.

O QSDsinalizador (Query String Discard) remove a string de consulta original da solicitação reescrita (não que isso realmente importe para uma reescrita interna).


Aparte:

RewriteRule /index.php /

Isso realmente não faz sentido como uma reescrita interna, já que ambos /index.phpe /devem retornar o mesmo recurso. (Isso normalmente seria implementado como um redirecionamento externo para resolver quaisquer problemas de SEO relacionados a conteúdo duplicado.)


ATUALIZAR:

Acho que encontrei um problema na abordagem geral, no entanto. Os arquivos reais não residem onde o link indica. Por favor, veja minha pergunta atualizada.

Se bem entendi sua atualização, o "arquivo real" que você deseja servir está armazenado no syncedsubdiretório e o sfpgparâmetro URL refere-se ao caminho do arquivo dentro desse subdiretório (menos o *)? (Que está tudo dentro do /library/Photographysubdiretório, incluindo o .htaccessarquivo. Ou pelo menos o .htaccessarquivo no qual estamos trabalhando aqui.)

Nesse caso, você só precisaria modificar a RewriteRulediretiva prefixando osubstituiçãocorda com synced/. Por exemplo:

:
RewriteRule ^index\.php$ synced/%1%2 [QSD,L]

(Todo o resto permanece inalterado em relação à regra acima, no início da minha resposta.)

informação relacionada