Используйте RewriteCond на основе переменной окружения в .htaccess
Я пытаюсь определить переменную среды в моем файле .htaccess, а затем запустите условие перезаписи с помощью этой переменной. Ниже приводится то, что у меня есть в моем файле .htaccess, но переписывание не работает:
RewriteEngine on
#set to 'live' or 'maintenance'
SetEnv ENVIRONMENT maintenance
#If the ENVIRONMENT variable is 'mainetnance' then show a maintenance page to the users
RewriteCond %{ENV:ENVIRONMENT} maintenance
RewriteRule ^(.*)$ /maintenance.html
Цель этого заключается в том, чтобы программным образом настроить сайт на режим обслуживания, если PHP отредактировал файл .htaccess, когда он получает почтовый запрос от одного из крючков GitHub, чтобы вытащить репо для обновления.
Ответы
Ответ 1
mod_rewrite не использует переменные, установленные через SetEnv, вместо этого используйте этот метод:
#set to 'live' or 'maintenance'
RewriteRule .* - [E=STATUS:maintenance]
#If the ENVIRONMENT variable is 'maintenance' then show a maintenance page
RewriteCond %{REQUEST_URI} !maintenance.html [NC]
RewriteCond %{ENV:STATUS} ^maintenance$
RewriteRule ^.*$ /maintenance.html [L]
Первая строка нижней тройки гарантирует, что после перенаправления пользователя в файл "maintenance.html" он не будет перенаправлен снова. Кроме того, пользователь постоянно перенаправляется в один и тот же файл, вызывая ошибку внутреннего внутреннего сервера 500. "AH00124: запрос превысил предел 10 внутренних перенаправлений из-за вероятной ошибки конфигурации".
Ответ 2
Бит поздно - но для всех остальных, ищущих...
используйте SetEnvIf - см.
правило mod_rewrite и setenv
SetEnvIf Request_URI ". *" ОКРУЖАЮЩАЯ СРЕДА = обслуживание
...
Ответ 3
Я обнаружил, что почти каждый пример оказался неполным, поэтому я приношу свое решение в таблицу. Мне нужно было создать переменную на основе моей серверной среды - локальная или production - затем запустить перезаписывание на основе этой серверной среды. В частности, если среда является производством, я хочу заставить https и www.
Почему бы не создать уникальный файл .htaccess для каждой серверной среды? Потому что я хочу включить .htaccess в свой репозиторий Git и не беспокоиться о том, чтобы прикрутить одну из моих сред.
Первое, что вам нужно знать, это то, что все это должно происходить в mod_rewrite, а это значит, что в вашем экземпляре Apache необходимо включить mod_rewrite. Если вы не знаете, как это проверить, создайте страницу phpinfo (http://www.phpinfofile.com/) и выполните поиск "mod_rewrite" в разделе "Loaded Modules".
Код .htaccess:
<IfModule mod_rewrite.c>
# Set SERVER_ENV=production if HTTP_HOST matches my production URL
RewriteCond %{HTTP_HOST} ^(www\.)?mysite\.com$ [NC]
RewriteRule .* - [E=SERVER_ENV:production]
# Force www. if SERVER_ENV is production
RewriteCond %{ENV:SERVER_ENV} ^production$
RewriteCond %{HTTP_HOST} !^www [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Force https if SERVER_ENV is production
RewriteCond %{ENV:SERVER_ENV} ^production$
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Set SERVER_ENV=local if HTTP_HOST matches my local URL
RewriteCond %{HTTP_HOST} ^www-local\.mysite\.local$ [NC]
RewriteRule .* - [E=SERVER_ENV:local]
</IfModule>
Примечания:
- Первое имя переменной - "SERVER_ENV", а значение - "production". Это имя/значение переменной может быть любым. Например, вы можете использовать MY_ENVIRONMENT: live. После того, как вы создали эту переменную в .htaccess, вы сможете найти ее в своем файле phpinfo - отличный способ проверить ее там.
![введите описание изображения здесь]()
-
Линии RewriteCond должны быть перед RewriteRule и должны быть сгруппированы вместе, как показано. У вас может быть 1 или более условий перезаписи, которые должны быть выполнены до того, как правило перезаписи начнется.
-
Я устанавливаю другую переменную, если HTTP_HOST является "локальным". У меня нет каких-либо условий/правил перезаписи, которые используют "локальную" переменную - я просто устанавливаю ее здесь для инструкции.