Dịch tập tin .htaccess sang IIS web.config

Giới thiệu

Nhiều ứng dụng PHP cần có file cấu hình như .htaccess. File .htaccess chứa các thiết lập của hosting, chuyển hướng website của bạn. Nói chung là nó là file cấu hình cho web của bạn

Trên IIS thì có file web.config để thiết lập cấu hình, cấu hình bảo mật,cấu hình trạng thái, ngôn ngữ và biên dịch web. Thường chạy trên hosting windows.

Vấn đề ở đây mà chúng ta muốn nói tới là: bạn muốn chuyển website sử dụng file .htaccess để cấu hình (VD wordpress) sang host windows. Nhưng host windows lại không cấu hình trên .htaccess mà lại cấu hình trên web.config.

Vậy nên bây giờ chúng ta sẽ dịch file .htaccess sang web.config

Ví dụ cụ thể

Bây giờ chúng ta file .htaccess như sau mà sẽ chuyển sang web.config với nội dung tưởng ứng nhé ^^

Code .htaccess

#
# Apache/PHP/Application settings:
#

# Protect files and directories from prying eyes.
<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>

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

# Follow symbolic links in this directory.
Options +FollowSymLinks

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

# Force simple error message for requests for non-existent favicon.ico.
<Files favicon.ico>
 ErrorDocument 404 "The requested file favicon.ico was not found.
</Files>

# Set the default handler.
DirectoryIndex index.php

# Override PHP settings. More in sites/default/settings.php
# but the following cannot be changed at runtime.

# PHP 4, Apache 1.
<IfModule mod_php4.c>
 php_value magic_quotes_gpc 0
 php_value register_globals 0
 php_value session.auto_start 0
 php_value mbstring.http_input pass
 php_value mbstring.http_output pass
 php_value mbstring.encoding_translation 0
</IfModule>

# PHP 4, Apache 2.
<IfModule sapi_apache2.c>
 php_value magic_quotes_gpc 0
 php_value register_globals 0
 php_value session.auto_start 0
 php_value mbstring.http_input pass
 php_value mbstring.http_output pass
 php_value mbstring.encoding_translation 0
</IfModule>

# PHP 5, Apache 1 and 2.
<IfModule mod_php5.c>
 php_value magic_quotes_gpc 0
 php_value register_globals 0
 php_value session.auto_start 0
 php_value mbstring.http_input pass
 php_value mbstring.http_output pass
 php_value mbstring.encoding_translation 0
</IfModule>

# 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>

# Various rewrite rules.
<IfModule mod_rewrite.c>
 RewriteEngine on

 # If your site can be accessed both with and without the 'www.' prefix, you
 # can use one of the following settings to redirect users to your preferred
 # URL, either WITH or WITHOUT the 'www.' prefix. Choose ONLY one option:
 #
 # To redirect all users to access the site WITH the 'www.' prefix,
 # (http://example.com/... will be redirected to http://www.example.com/...)
 # adapt and uncomment the following:
 # RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
 # RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]
 #
 # To redirect all users to access the site WITHOUT the 'www.' prefix,
 # (http://www.example.com/... will be redirected to http://example.com/...)
 # uncomment and adapt the following:
 # RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
 # RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]

 # Modify the RewriteBase if you are using Application in a subdirectory or in a
 # VirtualDocumentRoot and the rewrite rules are not working properly.
 # For example if your site is at http://example.com/application uncomment and
 # modify the following line:
 # RewriteBase /application
 #
 # If your site is running in a VirtualDocumentRoot at http://example.com/,
 # uncomment the following line:
 # RewriteBase /

 # Rewrite URLs of the form 'x' to the form 'index.php?q=x'.
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteCond %{REQUEST_URI} !=/favicon.ico
 RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
</IfModule>

# $Id: .htaccess,v 1.90.2.1 2008/07/08 09:33:14 goba Exp $

Code file web.config


<?xml version="1.0" encoding="UTF-8"?>
<configuration>

 <configSections>
 <sectionGroup name="system.webServer">
 <sectionGroup name="rewrite">
 <section name="rewriteMaps" overrideModeDefault="Allow" />
 <section name="rules" overrideModeDefault="Allow" />
 </sectionGroup>
 </sectionGroup>
 </configSections>

 <system.webServer>
 <security>
 <!-- This section should be uncommented after
 installation to secure the installation. -->
 <!--
 <requestFiltering>
 <denyUrlSequences>
 <add sequence="engine" />
 <add sequence="inc" />
 <add sequence="info" />
 <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>
 <directoryBrowse enabled="true" />
 <caching>
 <profiles>
 <add extension=".php" policy="DisableCache" kernelCachePolicy="DisableCache" />
 <add extension=".html" policy="CacheForTimePeriod" kernelCachePolicy="CacheForTimePeriod" duration="14:00:00:00" />
 </profiles>
 </caching>
 <rewrite>
 <rules>
 <rule name="block favicon" stopProcessing="true">
 <match url="favicon\.ico" />
 <action type="CustomResponse" statusCode="404" subStatusCode="1"
 statusReason="The requested file favicon.ico was not found"
 statusDescription="The requested file favicon.ico was not found" />
 </rule>
 <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>
 <defaultDocument>
 <files>
 <remove value="index.php" />
 <add value="index.php" />
 </files>
 </defaultDocument>

 <!-- 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>
 -->

 </system.webServer>
</configuration>

Bộ lọc (Request Filtering)

Ứng dụng sử dụng FilesMatch trong file .htaccess để hạn chế truy cập từ trình duyệt đến các thành phần có trong list


<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>

Khi chuyển sang web.config sẽ có dạng như sau

<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>

Chú ý: bạn có thể không cho phần này vào cài đặt. Phần dưới đây sẽ giúp bạn thông báo lỗi 403 khi có truy cập không cho phép

<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>

Trang mặc định(Default Document)

Trong các tập tin .htaccess, DirectoryIndex sẽ cho phép load file nào đó khi đường dẫn không thể tải bởi máy chủ web

# Set the default handler.
DirectoryIndex index.php

Khi chuyển sang file web.config sẽ có dạng như sau

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

Viết lại URL (URL Rewriting)

Mục đích của việc viết lại URL là để cho url ngắn hơn, dễ nhớ hơn.

Để biết thêm về mod_rewrite bạn có thể xem thêm tại đây: mod_rewrite

Mod_rewrite được viết trong file .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]

Khi chuyển sang ứng dụng IIS web.config

<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>

Lỗi chuyển hướng trang và xử lý (Error Page Redirects / Handling)

Khi vào một url không tồn tại trên máy chủ Web của bạn sẽ dẫn tới lỗi 404. Như vậy khi ta cấu hình ErrorDocument thì máy chủ web sẽ hướng các bạn tới trang đích

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

Khi dịch sang IIS web.config. Tuy nhiên chức năng này bị tắt theo mặc định của IIS vì vậy ta nên cho vào ghi chú như sau

<!-- 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>
 -->

Thư mục trình duyệt (Directory Browsing)

Nhiều host cho phép bạn xem thư mục trên trình duyệt. Việc này rất không hay cho bảo mật web. hãy tắt nó đi bằg Options

đặt trong .htaccess như sau

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

Khi chuyển sang web.config sẽ có dạng như sau

<directoryBrowse enabled="false" />

Lão hóa bộ nhớ đệm (Cache Aging)

Đảm bảo cho cache của bạn được lưu ở file tĩnh cho đến khi có cập nhập mới nhất. Sử dụng ExpiresBy  trong .htaccess được cung cấp bởi modun mod_expires.c

# 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>

Khi chuyển sang IIS thì file .html có tác dụng trong 14 ngày. Đảm bảo không có sự thay đổi nội dung của bạn

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

Tham khảo: chuyển file .htaccess sang IIS web.config bằng IIS manager
Chúc các bạn thành công ^^

Dịch tập tin .htaccess sang IIS web.config
5 (100%) 1 vote
  • Bình luận
Có thể bạn quan tâm
x