#php #.htaccess
#php #.htaccess
Вопрос:
В моем файле .htaccess я использую переменные ( SetEnv
) для включения / выключения веб-сайта при выполнении обновлений, безопасно ли это или вообще возможно изменить этот файл .htaccess с помощью PHP-скрипта?
Чтобы быть более конкретным, мне нужно прокомментировать / отменить комментарий к этим строкам:
#RewriteCond %{REMOTE_ADDR} !LOCALIPHERE
#RewriteCond %{REQUEST_URI} !^/Site/maintenance.htm
#RewriteCond %{REQUEST_URI} !^/Site/styles/style.css
#RewriteCond %{REQUEST_URI} !^/Site/includes/jquery-1.4.4.min.js
#RewriteCond %{REQUEST_URI} !.(jpg|jpeg|png|gif|swf)$
#RewriteRule ^.* /Site/maintenance.htm [L]
Спасибо
Редактировать:
Мое определение безопасности таково: я хотел бы знать, как будет вести себя сайт, если файл .htaccess открывается PHP-скриптом и веб-сайт посещается в одно и то же время.
Комментарии:
1. Тогда вам следует использовать атомарную запись
file_put_contents(".htaccess", $settings, LOCK_EX)
или еще лучшеrename()
. Таким образом, Apache будет перечитывать файл только тогда, когда он был написан полностью.2. @mario 1, там хорошие советы, а также очень приятная информация. Если файл заблокирован, то все подключения ожидаются до тех пор, пока файл не будет выпущен, потому что файл .htaccess необходимо продолжить перед выполнением php. Я прав?
3. Просто помните, что ваш новый файл .htaccess должен быть идеальным. Любые синтаксические ошибки и весь ваш сайт будут недоступны, потому что Apache начнет выдавать 500 внутренних ошибок из-за неправильных директив в неработающем .htaccess
4. LOCK_EX будет иметь эффект, только если ваш Apache также прочитает его в режиме LOCK_SH. Я полагаю, что большинство версий делают это, но не проверял. Переименование было бы еще более атомарным для файловой системы. — Но да, .htaccess обрабатывается до вызова PHP.
Ответ №1:
Если файл доступен для записи с помощью процесса PHP, он может быть изменен, как и любой другой файл.
Однако вместо комментирования вашего кода вам следует использовать RewriteCond
проверку вашего env var.
Комментарии:
1. Отличное решение. Могу ли я привести простой пример, если это возможно?
2. Смотрите httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritecond — »
%{ENV:variable}
, где переменной может быть любая переменная среды, также доступна. Это просматривается через внутренние структуры Apache и (если там не найдено) через getenv() из серверного процесса Apache.»
Ответ №2:
Я бы оценил «безопасное изменение» в рамках рассмотрения, если это надежно сделать — без внесения синтаксических ошибок. Для достижения этой цели я бы рекомендовал вам использовать более конкретные маркеры комментариев:
#<off>#RewriteCond %{RE...
Безопаснее сканировать и заменять его с помощью простых манипуляций со строками, что снижает вероятность возникновения ошибки 500 при изменении файлов .htaccess. Если у вас разные типы настроек, которые вы хотите включить / отключить, тогда используйте несколько более специфичных токенов.
Что касается самой безопасности, то их доступность для записи во всем мире имеет те же последствия, что и наличие доступных для записи во всем мире php-скриптов или файлов конфигурации.
Ответ №3:
Пока вы знаете, что вы делаете, это безопасно. Однако, если вы редактируете файл вручную и он не отражает эту ситуацию в вашем скрипте, его довольно легко взломать.