
У меня есть этот злополучный URL:
dom.tld/library/Photography/index.php?cmd=image&sfpg=2021/*IMG_3468.jpg
dom.tld/library/Photography/index.php?sfpg=2021/*
Это должно выглядеть так
dom.tld/library/Photography/2021/IMG_3468.jpg
dom.tld/library/Photography/2021/
По сути, я хочу удалить index.php?cmd=image&sfpg=
звездочку *
перед именем файла.
Структура папок выглядит так:
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
Реальные изображения хранятся synced/
и _GalData/
генерируются index.php. Основной веб-сайт находится по адресу/var/www/domain.tld/main/index.html
решение1
Я не уверен на 100%, что это лучший способ, но учитывая следующую структуру папок
user@instance-apache:/var/www/html$ tree -a
.
├── .htaccess
├── index.html
└── library
└── photography
└── folder
└── image.jpg
и это содержимое файла .htaccess [ОБНОВЛЕНО]
RewriteEngine on
RewriteCond %{QUERY_STRING} .*\=(.*)\*(.*)
RewriteRule (.*/)index.php /$1%1%2 [QSD]
apache должен делать
http://127.0.0.1/library/photography/index.php?cmd=image&sfpg=folder/*image.jpg
в
решение2
В .htaccess
файле, расположенном в подкаталоге, /library/photography/.htaccess
вы можете сделать что-то вроде следующего, используя mod_rewrite, чтобы внутренне перезаписать запрос на нужный URL.
RewriteEngine On
RewriteCond %{QUERY_STRING} (^|&)cmd=image(&|$)
RewriteCond %{QUERY_STRING} (?:^|&)sfpg=([^&*]+)\*([^&]+)(&|$)
RewriteRule ^index\.php$ %1%2 [QSD,L]
Первыйсостояние( RewriteCond
директива) просто подтверждает, что cmd=image
параметр URL присутствует в любом месте строки запроса.
Второйсостояниезахватывает части sfpg
значения параметра URL, окружающие *
символ (который необходимо экранировать обратной косой чертой при использовании)снаружикласса символов регулярного выражения, чтобы отрицать его особое значение). Затем они доступны в %1
и %2
обратных ссылках соответственно и используются взаменастрока (2-й аргумент директивы RewriteRule
) — это конструкцияродственникпуть к файлу (т.е. относительно /library/photography/
подкаталога, содержащего .htaccess
файл).
Параметры URL могут появляться в любом порядке. например, ?sfpg=folder/*image.jpg&cmd=image
также будут успешно соответствовать. И могут быть дополнительные параметры URL, которые отбрасываются.
Флаг QSD
(Отменить запрос строки) удаляет исходную строку запроса из перезаписанного запроса (не то чтобы это имело значение для внутренней перезаписи).
В стороне:
RewriteRule /index.php /
Это не имеет смысла как внутренняя переписывание, поскольку оба метода /index.php
и /
должны возвращать один и тот же ресурс. (Обычно это реализуется как внешнее перенаправление для решения любых проблем SEO, связанных с дублированием контента.)
ОБНОВЛЯТЬ:
Однако я думаю, что нашел проблему в общем подходе. Фактические файлы не находятся там, где подразумевает ссылка. Пожалуйста, см. мой обновленный вопрос.
Если я правильно понял ваше обновление, «реальный файл», который вы хотите предоставить, хранится в подкаталоге synced
, а sfpg
параметр URL ссылается на путь к файлу внутри этого подкаталога (за вычетом *
)? (Что все находится внутри /library/Photography
подкаталога, включая .htaccess
файл. Или, по крайней мере, .htaccess
файл, над которым мы здесь работаем.)
В этом случае вам, по-видимому, нужно будет только изменить директиву, RewriteRule
добавив префиксзаменастрока с synced/
. Например:
:
RewriteRule ^index\.php$ synced/%1%2 [QSD,L]
(Все остальное остается неизменным по сравнению с правилом, приведенным выше в начале моего ответа.)