Как удалить две отдельные части URL-адреса с помощью mod_rewrite?

Как удалить две отдельные части URL-адреса с помощью mod_rewrite?

У меня есть этот злополучный 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

в

http://127.0.0.1/library/photography/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]

(Все остальное остается неизменным по сравнению с правилом, приведенным выше в начале моего ответа.)

Связанный контент