Используйте 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 - отличный способ проверить ее там.

введите описание изображения здесь

  1. Линии RewriteCond должны быть перед RewriteRule и должны быть сгруппированы вместе, как показано. У вас может быть 1 или более условий перезаписи, которые должны быть выполнены до того, как правило перезаписи начнется.

  2. Я устанавливаю другую переменную, если HTTP_HOST является "локальным". У меня нет каких-либо условий/правил перезаписи, которые используют "локальную" переменную - я просто устанавливаю ее здесь для инструкции.