
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
Responder2
No .htaccess
arquivo localizado no subdiretório em /library/photography/.htaccess
você 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( RewriteCond
diretiva) simplesmente confirma que o cmd=image
parâmetro URL está presente em qualquer lugar da string de consulta.
O segundodoençacaptura as partes do sfpg
valor 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 %1
e %2
respectivamente e são usados nosubstituiçãostring (2º argumento da RewriteRule
diretiva) é construir umrelativocaminho do arquivo (ou seja, relativo ao /library/photography/
subdiretório que contém o .htaccess
arquivo).
Esses parâmetros de URL podem aparecer em qualquer ordem. por exemplo. ?sfpg=folder/*image.jpg&cmd=image
também combinaria com sucesso. E pode haver parâmetros de URL adicionais, que são descartados.
O QSD
sinalizador (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.php
e /
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 synced
subdiretório e o sfpg
parâmetro URL refere-se ao caminho do arquivo dentro desse subdiretório (menos o *
)? (Que está tudo dentro do /library/Photography
subdiretório, incluindo o .htaccess
arquivo. Ou pelo menos o .htaccess
arquivo no qual estamos trabalhando aqui.)
Nesse caso, você só precisaria modificar a RewriteRule
diretiva 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.)