Это смотря где в <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-пути), но я предполагаю, что это должно быть особое требование?