Рейтинг:1

Apache 2.4 Конвертируйте .htaccess и перепишите его в vhost.conf

флаг pl

Я переписываю конфигурацию Apache 2.4, полученную от старой команды разработчиков.

У меня ~200 строк похожей конфигурации, и я не могу понять, по какому принципу мне нужно изменить этот код, чтобы перенести его из .htaccess на виртуальный хост.

Условия перезаписи %{QUERY_STRING} ^$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteCond %{REQUEST_URI} !^/application-module/(.*)$
RewriteCond %{REQUEST_URI} !(.*)json$ [NC]
RewriteCond %{REQUEST_URI} !playground/local-loader/(.*)$ [NC]
Правило перезаписи ^(.*)$ /$1/ [R,L,NC]

Когда я просто перемещаю его на виртуальный хост, мой сайт падает в местах, которые я не понимаю.

Chris avatar
флаг it
В .htaccess правила перезаписи применяются к каталогу, в котором находится .htaccess. В виртуальном хосте вы должны установить эти правила в или же блокировать.
флаг pl
Спасибо! Я пытался сделать это таким образом, но похоже, что правила нужно как-то изменить. Я также понимаю, что пути к файлам нужно исправлять, но регулярные выражения сводят меня с ума.
Рейтинг:0
флаг kz

Это смотря где в <VirtualHost> контейнер, в который вы помещаете эти директивы.

Если вы используете <Directory> контейнер (т.е. каталог контекст) и отключение .htaccess переопределяет полностью (иначе .htaccess переопределит <Directory> контейнер!) то вы можете в значительной степени скопировать директивы как есть (при условии, что <Directory> контейнер ссылается на тот же каталог, что и .htaccess файл сделал).

Однако, если вы помещаете эти директивы непосредственно в <VirtualHost> контейнер (вне <Directory> контейнер), т. в виртуальный хост контекст, то вам нужно внести некоторые изменения. Это связано с тем, что директивы обрабатываются раньше, до того, как запрос будет сопоставлен с файловой системой.

В опубликованных вами директивах потребуются только два изменения:

  • В виртуальный хост контекст, REQUEST_FILENAME серверная переменная еще не преобразована в имя файла. Это то же самое, что REQUEST_URI (т.е. запрошенный URL). Таким образом, ваша проверка файловой системы всегда будет давать сбой, а условие всегда будет успешным! Вам либо нужно использовать просмотр вперед. например. %{LA-U:REQUEST_FILENAME}, или создайте абсолютное имя файла самостоятельно. например. %{DOCUMENT_ROOT}%{REQUEST_URI}. Например:

    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
    
  • В виртуальный хост контекст, URL-путь, который соответствует Правило перезаписи шаблон является корневым (начиная с косой черты). В то время как в .htaccess это относительно каталога, содержащего .htaccess файл - без префикса косой черты. Таким образом, правило в том виде, в котором оно написано, приведет к двойной косой черте в начале URL-пути, вместо этого его следует переписать следующим образом:

    Правило перезаписи ^/(.*)$ /$1/ [R,L]
    

    ( Северная Каролина флаг здесь не требуется.)

    Или (предпочтительнее) не используйте обратную ссылку здесь и используйте REQUEST_URI переменная сервера (которая, естественно, работала бы в .htaccess также). Например:

    RewriteRule ^ %{REQUEST_URI}/ [R, L]
    

    (В стороне: Вероятно, это также должно быть постоянное перенаправление 301 (т. Р=301). В нынешнем виде по умолчанию это будет временное перенаправление 302. Но переходите на 301 — если это намерение — только после того, как вы подтвердите, что он работает как задумано.)

Итак, в итоге это станет:

Условия перезаписи %{QUERY_STRING} ^$
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteCond %{REQUEST_URI} !^/application-module/(.*)$
RewriteCond %{REQUEST_URI} !(.*)json$ [NC]
RewriteCond %{REQUEST_URI} !playground/local-loader/(.*)$ [NC]
Правило перезаписи ^/(.*)$ /$1/ [R,L]

В стороне:

Вышеупомянутое можно сразу немного оптимизировать, переместив проверку файловой системы (что относительно дорогая) к последнему условию и перемещая условие который проверяет, что запрос еще не заканчивается косой чертой Правило перезаписи директива. Кроме того, подшаблоны регулярных выражений (.*) в каждом из условия не требуются. Таким образом, приведенное выше можно было бы переписать более эффективно:

Условия перезаписи %{QUERY_STRING} ^$
RewriteCond %{REQUEST_URI} !^/application-module/
RewriteCond %{REQUEST_URI} !json$ [NC]
RewriteCond %{REQUEST_URI} !playground/local-loader/ [NC]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
Правило перезаписи !/$ %{REQUEST_URI}/ [R,L]

Проверку файловой системы, возможно, можно вообще удалить, если вместо этого вы исключите запросы, которые содержат (как выглядит) расширение файла, но это может зависеть от вашей файловой структуры.

условие который проверяет !json$ похоже, что он действительно должен проверять .json расширение файла, т.е. !\.json$. (Это связано с моим комментарием выше об исключении все запросы, которые имеют "расширение файла".)

Первое условие который проверяет, что строка запроса пуста, кажется немного странным (поскольку на самом деле не имеет значения, есть ли строка запроса или нет при добавлении косой черты к URL-пути), но я предполагаю, что это должно быть особое требование?

флаг pl
это круто! все понятно, и теперь все работает! Спасибо много раз!

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

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