Рейтинг:2

Правила перезаписи Apache .htaccess в правила, преобразованные в NGINX, неэффективны

флаг pe

Я запускаю веб-сайт «PHP-скрипт» на aaPanel с установленным Debian 10. Все работает нормально, но изображения не отображаются/разбиваются

Путь /image/ является правилом перезаписи и разрешается в image.php, который загружает изображение из папки загрузки. после преобразования .htaccess в Nginx и добавления их в систему все пути к изображениям идут к

www.website.com/image/m/112/112/335757712_1152702765_706821275.jpeg

Фактический путь должен быть

www.website.com/uploads/media/112/112/335757712_1152702765_706821275.jpeg

Ниже приведены правила .htaccess.

RewriteEngine включен
RewriteCond %{request_filename} -f
Правило перезаписи ^(.*) $1 [L]
Правило перезаписи ^(([^/]*)+)?$ index.php?a=$1 [L]

RewriteRule ^welcome/?$ index.php?a=welcome [NC]

RewriteRule ^stream/?$ index.php?a=stream [NC]
RewriteRule ^stream/logout$ index.php?a=stream&logout [NC]

RewriteRule ^explore/?$ index.php?a=explore [NC]
RewriteRule ^explore/filter/([^/]+)/?$ index.php?a=explore&filter=$1 [NC]
RewriteRule ^explore/popular$ index.php?a=explore&popular [NC]
RewriteRule ^explore/liked$ index.php?a=explore&liked [NC]

RewriteRule ^history/?$ index.php?a=history [NC]

RewriteRule ^upload/?$ index.php?a=upload [NC]

Правило перезаписи ^pro/?$ index.php?a=pro [NC]

RewriteRule ^stats/?$ index.php?a=stats [NC]
RewriteRule ^stats/filter/([^/]+)/?$ index.php?a=stats&filter=$1 [NC]

RewriteRule ^profile/([^/]+)/?$ index.php?a=profile&u=$1 [NC]
RewriteRule ^profile/([^/]+)/([^/]+)/?$ index.php?a=profile&u=$1&r=$2 [NC]
RewriteRule ^profile/([^/]+)/filter/([^/]+)/?$ index.php?a=profile&u=$1&filter=$2 [NC]

RewriteRule ^notifications/?$ index.php?a=notifications [NC]
RewriteRule ^notifications/filter/([^/]+)/?$ index.php?a=notifications&filter=$1 [NC]

Правило перезаписи ^settings/?$ index.php?a=settings [NC]
Правило перезаписи ^settings/([^/]+)/?$ index.php?a=settings&b=$1 [NC]

RewriteRule ^messages/?$ index.php?a=messages [NC]
RewriteRule ^messages/([^/]+)/([^/]+)/?$ index.php?a=messages&u=$1&id=$2 [NC]

Правило перезаписи ^track/([^/]+)/?$ index.php?a=track&id=$1 [NC]
RewriteRule ^track/([^/]+)/edit/?$ index.php?a=track&id=$1&type=edit [NC]
RewriteRule ^track/([^/]+)/report/?$ index.php?a=track&id=$1&type=report [NC]
RewriteRule ^track/([^/]+)/stats/?$ index.php?a=track&id=$1&type=stats [NC]
RewriteRule ^track/([^/]+)/likes/?$ index.php?a=track&id=$1&type=likes [NC]
RewriteRule ^track/([^/]+)/stats/filter/([^/]+)/?$ index.php?a=track&id=$1&type=stats&filter=$2 [NC]
RewriteRule ^track/([^/]+)/([^/]+)/?$ index.php?a=track&id=$1&name=$2 [NC]

RewriteRule ^playlist/([^/]+)/?$ index.php?a=playlist&id=$1 [NC]
RewriteRule ^playlist/([^/]+)/edit/?$ index.php?a=playlist&id=$1&edit=true [NC]
RewriteRule ^playlist/([^/]+)/([^/]+)/?$ index.php?a=playlist&id=$1&name=$2 [NC]

RewriteRule ^search/filter/([^/]+)/([^/]+)/?$ index.php?a=search&filter=$1&q=$2 [NC]

Правило перезаписи ^page/([^/]+)/?$ index.php?a=page&b=$1 [NC]

RewriteRule ^recover/?$ index.php?a=recover [NC]
RewriteRule ^recover/do/?$ index.php?a=recover&r=1 [NC]

Правило перезаписи ^image/([^/]+)/([^/]+)/([^/]+)/([^/]+)/?$ image.php?t=$1&w=$2&h= $3&источник=$4

Ниже приведены преобразованные правила Nginx.

место расположения / {
  если (-e $request_filename){
    переписать ^/(.*) /$1 break;
  }
  переписать ^/(([^/]*)+)?$ /index.php?a=$1 break;
}

расположение / добро пожаловать {
  переписать ^/welcome/?$ /index.php?a=welcome;
}

местоположение/поток {
  переписать ^/stream/?$ /index.php?a=stream;
}

местоположение = /поток/выход {
  переписать ^(.*)$ /index.php?a=stream&logout;
}

местоположение / исследовать {
  переписать ^/explore/?$ /index.php?a=explore;
  переписать ^/explore/filter/([^/]+)/?$ /index.php?a=explore&filter=$1;
}

местоположение = /исследовать/популярное {
  переписать ^(.*)$ /index.php?a=explore&popular;
}

location = /исследовать/понравилось {
  переписать ^(.*)$ /index.php?a=explore&liked;
}

местоположение/история {
  переписать ^/history/?$ /index.php?a=history;
}

местоположение/загрузить {
  переписать ^/upload/?$ /index.php?a=upload;
}

местоположение / pro {
  переписать ^/pro/?$ /index.php?a=pro;
}

местоположение/статистика {
  переписать ^/stats/?$ /index.php?a=stats;
  переписать ^/stats/filter/([^/]+)/?$ /index.php?a=stats&filter=$1;
}

местоположение/профиль {
  переписать ^/profile/([^/]+)/?$ /index.php?a=profile&u=$1;
  переписать ^/profile/([^/]+)/([^/]+)/?$ /index.php?a=profile&u=$1&r=$2;
  переписать ^/profile/([^/]+)/filter/([^/]+)/?$ /index.php?a=profile&u=$1&filter=$2;
}

местоположение/уведомления {
  переписать ^/notifications/?$/index.php?a=notifications;
  переписать ^/notifications/filter/([^/]+)/?$ /index.php?a=notifications&filter=$1;
}

местоположение/настройки {
  переписать ^/settings/?$ /index.php?a=settings;
  переписать ^/settings/([^/]+)/?$ /index.php?a=settings&b=$1;
}

местоположение/сообщения {
  переписать ^/messages/?$ /index.php?a=messages;
  переписать ^/messages/([^/]+)/([^/]+)/?$ /index.php?a=messages&u=$1&id=$2;
}

местоположение / трек {
  переписать ^/track/([^/]+)/?$ /index.php?a=track&id=$1;
  переписать ^/track/([^/]+)/edit/?$ /index.php?a=track&id=$1&type=edit;
  переписать ^/track/([^/]+)/report/?$ /index.php?a=track&id=$1&type=report;
  переписать ^/track/([^/]+)/stats/?$ /index.php?a=track&id=$1&type=stats;
  переписать ^/track/([^/]+)/likes/?$ /index.php?a=track&id=$1&type=likes;
  переписать ^/track/([^/]+)/stats/filter/([^/]+)/?$ /index.php?a=track&id=$1&type=stats&filter=$2;
  переписать ^/track/([^/]+)/([^/]+)/?$ /index.php?a=track&id=$1&name=$2;
}

местоположение / плейлист {
  переписать ^/playlist/([^/]+)/?$ /index.php?a=playlist&id=$1;
  переписать ^/playlist/([^/]+)/edit/?$ /index.php?a=playlist&id=$1&edit=true;
  переписать ^/playlist/([^/]+)/([^/]+)/?$ /index.php?a=playlist&id=$1&name=$2;
}

местоположение/поиск {
  переписать ^/search/filter/([^/]+)/([^/]+)/?$ /index.php?a=search&filter=$1&q=$2;
}

местоположение/страница {
  переписать ^/page/([^/]+)/?$ /index.php?a=page&b=$1;
}

местоположение / восстановить {
  переписать ^/recover/?$ /index.php?a=recover;
  переписать ^/recover/do/?$ /index.php?a=recover&r=1;
}

местоположение/изображение {
  переписать ^/image/([^/]+)/([^/]+)/([^/]+)/([^/]+)/?$ /image.php?t=$1&w=$2 &h=$3&src=$4;
}

Я в замешательстве и не могу ничего придумать, чтобы понять это. Спасибо

Рейтинг:3
флаг us

Преобразователи правил перезаписи обычно довольно плохи. Тогда лучше реализовать нативным способом nginx. В этом случае изображение расположение будет следующим:

расположение ~ ^/изображение/([^/]+)/([^/]+)/([^/]+)/([^/]+)$ {
    try_files /image.php?t=$1&w=$2&h=$3&src=$4 =404;
}

КСТАТИ. я надеюсь твои изображение.php имеет правильную проверку ввода для ширины/высоты, так что злоумышленник не может DDoS-атак на ваш сервер, запрашивая версию изображения размером 1M x 1M...

флаг pe
Да, я согласен с преобразователями перезаписи. Вы дали мне правильное правило. после добавления правила все мои изображения ожили :) Большое спасибо за этот ответ. Я узнал что-то новое сегодня.
флаг cn
Вместо этого в этой ситуации гораздо лучше использовать `переписать`. `image.php` существует всегда. Нет смысла проверять существование файла с помощью `try_files`..
флаг us
Я не думаю, что здесь есть какая-то разница между `try_files` и `rewrite`. Оба пытаются открыть файл, отличается только обработка ошибок.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.