.htaccess в IIS web.config

Материал из rrv-wiki
Перейти к навигации Перейти к поиску


.htaccess в IIS web.config

Оригинал

Request Filtering

Тут используется директива FilesMatch в файле .htacess, чтобы ограничить доступ браузера к файлам, которые являются компонентами приложения.

<FilesMatch "\.(engine|inc|info|install|module|profile|po|sh|.*sql|theme|tpl(\.php)?|xtmpl)$|^(code-style\.pl|Entries.*|Repository|Root|Tag|Template)$">
  Order allow,deny
</FilesMatch>

IIS использует модуль фильтрации запросов, чтобы ограничить доступ браузера к файлам. Web.config для примера выше:

      <security>
           <requestFiltering>
               <denyUrlSequences>
                   <add sequence="engine" />
                   <add sequence="inc" />
                   <add sequence="info" />
                   <add sequence="install" />
                   <add sequence="module" />
                   <add sequence="profile" />
                   <add sequence="po" />
                   <add sequence="sh" />
                   <add sequence="theme" />
                   <add sequence="tpl(\.php" />
                   <add sequence="Root" />
                   <add sequence="Tag" />
                   <add sequence="Template" />
                   <add sequence="Repository" />
                   <add sequence="code-style" />
               </denyUrlSequences>
               <fileExtensions>
                   <add fileExtension=".sql" allowed="false" />
                   <add fileExtension=".pl" allowed="false" />
               </fileExtensions>
           </requestFiltering>
       </security>

Альтернативой использованию фильтрации запросов является использование модуля URL Rewriter для возврата ошибки 403 для любого из соответствующих типов файлов. Преимущество модуля URL Rewriter заключается в том, что он использует регулярное выражение для сопоставления.

       <rule name="Protect files and directories from prying eyes" stopProcessing="true">
               <match url="\.(engine|inc|info|install|module|profile|test|po|sh|.*sql|theme|tpl(\.php)?|xtmpl|svn-base)$|^(code-style\.pl|Entries.*|Repository|Root|Tag|Template|all-wcprops|entries|format)$" />
               <action type="CustomResponse" statusCode="403" subStatusCode="0"
                   statusReason="Forbidden"
                   statusDescription="Access is forbidden." />
       </rule>

Default Document

В файле .htaccess директива DirectoryIndex сообщает веб-серверу, какой файл загружать, если имя файла не включено в URL-адресе

# Set the default handler.
DirectoryIndex index.php

Для IIS, документ по умолчанию должен быть установлен в самой верхней иерархии веб-сайта в качестве обработчика модуля. Например, PHP, обработчик модуля обычно устанавливается на уровне веб-сервера. Документ по умолчанию должен быть установлен на этом уровне также, а не локально в контексте веб-сайта. Следующий код в файле Web.config может переопределить какой файл использовать:

       <defaultDocument>
           <files>
               <remove value="index.php" />
               <add value="index.php" />
           </files>
       </defaultDocument>

URL Rewriting

IIS включает модуль URL Rewrite. Вы можете использовать это расширение для предоставления правилам IIS перезаписи входящих запросов URL. Наиболее распространенное использование URL Rewriting - предоставление более коротких и удобных для запоминания URL-адресов.

Многие PHP-приложения в настоящее время поставляются с rewrite правилами в своих файлах .htaccess. Эти правила описывают mod_rewrite Apache, как и когда переписывать входящие запросы. Модуль URL Rewriting IIS может читать эти правила и транслировать их в правила URL Rewriting.

Для примера правила mod_rewrite в файле .htaccess:

 RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
 RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]

 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteCond %{REQUEST_URI} !=/favicon.ico
 RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

Переведенные правила URL Rewriter:

<rewrite>
 <rules>
   <rule name="Imported Rule 1" stopProcessing="true">
     <match url="^(.*)$" ignoreCase="false" />
     <conditions>
       <add input="{HTTP_HOST}" pattern="^example\.com$" />
     </conditions>
     <action type="Redirect" redirectType="Permanent" url="http://www.example.com/{R:1}" />
   </rule>
   <rule name="Imported Rule 2" stopProcessing="true">
     <match url="^(.*)$" ignoreCase="false" />
     <conditions>
       <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
       <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
       <add input="{URL}" pattern="^/favicon.ico$" ignoreCase="false" negate="true" />
     </conditions>
     <action type="Rewrite" url="index.php?q={R:1}" appendQueryString="true" />
   </rule>
 </rules>
</rewrite>

Error Page Redirects / Handling

Некоторые приложения обрабатывают стандартные ошибки в рамках приложения. Директива ErrorDocument в файле .htaccess примера сообщает веб-серверу загрузить домашнюю страницу для обработки любых ошибок 404 или «Файл не найден»

# Make Application handle any 404 errors.
ErrorDocument 404 /index.php

IIS использует директиву httpErrors для этой функции. Однако, поскольку возможность установки этого параметра на уровне приложения по умолчанию отключена для IIS, этот раздел должен быть закомментирован.:

       <!-- HTTP Errors section should only be enabled if the "Error Pages"
       feature has been delegated as "Read/Write" at the Web Server level.
          <httpErrors>
              <remove statusCode="404" subStatusCode="-1" />
              <error statusCode="404" prefixLanguageFilePath="" path="/index.php" responseMode="ExecuteURL" />
          </httpErrors>
       -->

Directory Browsing

Другая часто применяемая мера безопасности (или целостности) приложения - отключение просмотра каталогов. Многие конфигурации веб-серверов позволят пользователям просматривать список файлов в каталоге, который не содержит один из файлов документов по умолчанию. .htaccess пример (директива Options):

# Don't show directory listings for URLs which map to a directory.
Options -Indexes

Аналогичный пример Web.config с помощью директивы directoryBrowse:

       <directoryBrowse enabled="false" />

Cache Aging

Директивы кэширования используются для обеспечения кэширования статического содержимого в течение определенного периода времени, а динамический контент вообще не кэшируется. В файле .htaccess пример использования директивы ExpiresBy, предоставляемые модулем mod_expires:

# Requires mod_expires to be enabled.
<IfModule mod_expires.c>
  # Enable expirations.
  ExpiresActive On
 
  # Cache all files for 2 weeks after access (A).
  ExpiresDefault A1209600
 
  # Do not cache dynamically generated pages.
  ExpiresByType text/html A1
</IfModule>

В файле Web.config IIS использует модуль Output Caching и директиву кэширования для управления кешированием. В примере приложения вы можете включить кеширование для .html-файлов максимум 14 дней. Для .php-файлов кеширование вообще не выполняется:

       <caching>
           <profiles>
               <add extension=".php" policy="DisableCache" kernelCachePolicy="DisableCache" />
               <add extension=".html" policy="CacheForTimePeriod" kernelCachePolicy="CacheForTimePeriod" duration="14:00:00:00" />
           </profiles>
       </caching>

IIS URL Rewriting and Microsoft® ASP.NET routing.