У меня нет доступа к файлам конфигурации сервера Apache, и я могу влиять на конфигурацию только через файлы .htaccess
.
К сожалению, это ограничивает некоторые вещи, которые можно захотеть сделать.
Например, самый простой способ перенаправить все HTTP-запросы на HTTPS:
<If "%{HTTPS} != 'on'">
Redirect permanent / https://www.my-domain.com/
</If>
Однако это вынуждает меня жестко закодировать доменное имя, поэтому я не могу легко повторно использовать этот файл .htaccess
.
В моем случае один и тот же сайт может быть доступен из нескольких разных доменов (только с одной базовой файловой системой), так что это вообще не вариант.
Я не могу решить эту проблему путем перенаправления на https://%{SERVER_NAME}/
поскольку оператор Redirect
не поддерживает такой тип подстановки переменных (за исключением разделов <Location>
или <LocationMatch>
, но, конечно, это не так. доступно для файлов .htaccess
).
Так что уже, если я хочу иметь общую / повторно используемую конфигурацию .htaccess
, я вынужден использовать mod_rewrite
вместо Redirect
чтобы я мог использовать подстановку серверных переменных.
Соответствующее решение
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [R=permanent,L]
что уже значительно сложнее, не говоря уже о возможном взаимодействии с другими правилами mod_rewrite
я, возможно, захочу установить - предпочтительно, я хотел бы свести к минимуму использование mod_rewrite
из-за его сложности.
Другой пример, для которого я вообще не нашел обходного пути, это mod_substitute
, который вообще не поддерживает расширение %{variable}
.
Если мой сайт находится в определенном подкаталоге (sub_dir
) на сервере, и я хочу постобработать все ссылки на HTML-страницах в этом каталоге, я могу сделать
AddOutputFilterByType SUBSTITUTE text/html
Substitute s~/sub_dir/[^\s]+/~/sub_dir/something_else/~
поэтому здесь я должен жестко закодировать каталог sub_dir
, который мне придется заменить для любого другого подкаталога, в котором я мог бы выполнить такую же замену (нет, у меня нет доступа к корневому URL /
).
Если бы это было правило перезаписи, я мог бы просто определить переменную среды %{env:site_dir}
следующим образом:
RewriteRule ^ - [E=site_dir:/sub_dir]
но эта переменная окружения бесполезна для меня, потому что mod_substitute
не интерпретирует их.
Итак, есть ли способ избежать жесткого кодирования и дублирования доменов и подкаталогов, подобных этому, в таких модулях, как mod_alias
или mod_substitute
, которые не имеют тех же механизмов, что и mod_rewrite
?
Например, каким-то образом получить доступ к переменным среды, таким как %{env:variable}
в этих модулях?