Назад | Перейти на главную страницу

Apache2.4 htaccess - отрицательный ifModule выполняется независимо

Рассмотрим следующие директивы Apache conf внутри .htaccess:

ErrorDocument 403 /dbug.html

<IfModule !mod_php5.c>
    Require all denied
</IfModule>

Он запрещает доступ, хотя mod_php5 активен, но игнорирует ErrorDocument
Если я удалю ! это вызывает ErrorDocument 403 - что должно, но это наоборот и неправильно ..

Любой ответ / совет будут оценены, спасибо.

В некоторых средах с общим хостингом доступно переключение версии live-модуля (горячее переключение); в результате основное имя модуля (обработчик модуля) может отличаться от имени целевого модуля, но целевой модуль будет отображаться как присутствующий только тогда, когда он вызывается обработчиком модуля.

Решение состоит в том, чтобы отследить имя модуля-обработчика и указать, что вместо этого ... свяжитесь с хостинг-провайдером. В этом случае имя модуля-обработчика: mod_php_null (Хетцнер); так <ifModule !mod_php_null.c> будет работать, как ожидалось -BUT-, чтобы установить директивы для целевого модуля, используйте имя целевого модуля; так тогда <ifModule !mod_php7.c> будет работать как положено.

Если для такого модуля нет «модуля-обработчика», то ссылка на целевой модуль напрямую в обоих условиях должен работать, поскольку он загружается при запуске демона сервера.

Как указано в комментариях, это может быть (частично) выгодно для безопасности в качестве переносимого решения между различными совместно используемыми или выделенными / управляемыми серверами; так что надеюсь это кому-нибудь пригодится:

Улучшенный .htaccess

# note :: important : read this
# -----------------------------------------------------------------------------------------------------------------------------
# the directives expressed in this file are compatible with shared hosting and crucial to security -and framework integrity
# the objective is to provide a fast/solid/stable runtime environment that compliments the designated PHP framework
# -----------------------------------------------------------------------------------------------------------------------------



# conf :: main : primary config for security & compatibility
# -----------------------------------------------------------------------------------------------------------------------------
   Options           -Indexes -Multiviews
   ServerSignature   Off
   DefaultLanguage   en-US
   AddDefaultCharset UTF-8
# -----------------------------------------------------------------------------------------------------------------------------



# cond :: 403 : trigger `Forbidden` if missing Apache modules .. it would be better to trigger 503 instead .. (possible?)
# -----------------------------------------------------------------------------------------------------------------------------
   <IfModule !mod_env.c>
      Require all denied
   </IfModule>
   <IfModule !mod_php_null.c>
      Require all denied
   </IfModule>
   <IfModule !mod_rewrite.c>
      Require all denied
   </IfModule>
   <IfModule !mod_headers.c>
      Require all denied
   </IfModule>
# -----------------------------------------------------------------------------------------------------------------------------



# defn :: vars : for DRYKIS principle .. (leave your sister out of this)
# -----------------------------------------------------------------------------------------------------------------------------
   <IfModule mod_env.c>
      SetEnv BOTMATCH "bot|crawl|fetch|find|grab|scan|search|site|slurp|spider|wget|curl"
   </IfModule>
# -----------------------------------------------------------------------------------------------------------------------------



# conf :: PHP-ini : runtime - some of these may be ignored on shared-hosting .. change `mod_php7` to the available PHP module
# -----------------------------------------------------------------------------------------------------------------------------
   <IfModule mod_php7.c>
      php_value default_charset     UTF-8
      php_value short_open_tag      On
      php_value display_errors      On
      php_value expose_php          Off
      php_value allow_url_fopen     On
      php_value memory_limit        128M
      php_value upload_max_filesize 32M
      php_value post_max_size       128M
      php_value max_input_time      30
      php_value max_execution_time  60
   </IfModule>
# -----------------------------------------------------------------------------------------------------------------------------



# conf :: headers : try to resolve self-signed-certificate issues and avoid version exploits .. PHP-ini "should" handle this
# -----------------------------------------------------------------------------------------------------------------------------
   <IfModule mod_headers.c>
      Header unset Server
      Header unset Strict-Transport-Security
      Header always set Strict-Transport-Security "max-age=0;includeSubDomains"
      Header always unset X-Powered-By
      Header unset X-Powered-By
   </IfModule>
# -----------------------------------------------------------------------------------------------------------------------------



# exec :: request : force compliance for: REST & FQDN & HTTPS/WSS .. the PHP framework handles all .. hide *debug* from "bots"
# -----------------------------------------------------------------------------------------------------------------------------
   <IfModule mod_rewrite.c>
      RewriteEngine On
      RewriteBase /

      RewriteCond %{HTTP:REQUEST_METHOD} !^$
      RewriteRule ^ - [R=400,L]

      RewriteCond %{HTTP:USER_AGENT} !^$
      RewriteRule ^ - [R=400,L]

      RewriteCond %{HTTP_X_Accept} !^$
      RewriteRule ^ - [R=400,L]

      RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
      RewriteRule ^ %{REQUEST_SCHEME}://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

      RewriteCond %{REQUEST_SCHEME} =http
      RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

      RewriteCond %{REQUEST_SCHEME} =ws
      RewriteRule ^ wss://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

      RewriteCond %{DOCUMENT_ROOT}/..php -f
      RewriteRule ^(.*)$ ..php [L]

      RewriteCond %{HTTP_USER_AGENT} "$BOTMATCH" [NC]
      RewriteRule ^ - [R=503,L]

      RewriteCond %{DOCUMENT_ROOT}/.auto/system/dbug.htm -f
      RewriteRule ^(.*)$ .auto/system/dbug.htm [L]

      RewriteRule ^ - [R=500,L]
   </IfModule>
# -----------------------------------------------------------------------------------------------------------------------------