Htaccess چیست و چه کاربردی دارد و مقایسه آن با امکانات سرور ویندوزی

برنامه نویسی و کدینگ > سایر موارد
 
 
بسیاری از نرم افزار هایی که با PHP توسعه داده شده اند برای اعمال پیکر بندی خود بر روی آپاچی از فایل .htaccess استفاده می نمایند. قابلیت های این فایل بسیار گسترده است و برخی از آنها ذیلا فهرست شده:
 
  • کنترل ریدایرکت
  • کنترل دسترسی فیزیکی به فایلها و پوشه ها
  • کنترل نمایش خطاهای Apache
  • تنظیمات  URL Rewrite
  • مسدود کردن یک یا چند IP خاص یا یک رنج IP
  • گذاشت پسورد بر روی پوشه ای خاص
  • تنظیمات کش و Expire Date آن
  • اعمال برخی تغییرات در تنظیمات پیش فرض PHP، MySQL و Apache
  • جلوگیری از نمایش تمامی فایلها یا یک یا چند فایل با پسوندی خاص
  • اضافه نمودن یک MIME
  • معرفی یک Default Document در پوشه ای خاص
  • تنظیم Default Charset
تنظیماتی که در فایل .htaccess قرار داده می شود بر روی پوشه جاری و زیر پوشه های آن اعمال می گردد و با قرار دادن یک فایل .htaccess دیگر در زیر پوشه ای خاص تنظیمات پوشه والد را نقض نمود.
بدیهی است که Microsoft هم برای اعمال تنظیمات بر روی IIS چنین امکانی را فراهم کرده باشد. شما می توانید مشابه همین تنظیمات را در فایل web.config پیاده سای کنید. تقریبا تمامی کد هایی که در فایل .htaccess استفاده می شوند را می توان در فایل web.config شبیه سازی کرد.
Microsoft در IIS خود امکانی برای ترجمه مستقیم کد های .htaccess به ساختار XML قابل قبول در Web.config تهیه نموده تا پشتیبانی از سایتهای ایجاد شده توسط PHP را کامل کند. برای آشنایی بیشتر با این امکان می توانید از راهنمای زیر استفاده کنید:
 
http://support.iranhost.com/kb/a154/rule-iis-import.aspx
 
روشی که در کد نویسی فایل web.config استفاده شده به دلیل استفاده از ساختار XML به مراتب ساختار مند تر از فایل .htaccess می باشد و ویرایش و رفع عیب کد های این فایل را راحت تر نموده.
ذیلا به برخی از امکانات فایل .htaccess و معادل آن در فایل web.config می پردازیم:
 
فیلتر درخواست های مرورگر:
از طریق این تنظیم می تواند درخواست های مرورگر برای دسترسی به پوشه ها یا پسوند های خاصی از فایل را محدود نمود. برای اعمال این محدودیت در فایل .htaccess از دستور FilesMatch استفاده می کنیم و در فایل web.config از دستور requestFiltering کمک می گیریم.
 
نمونه کد htaccess:
 
<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>
 
نمونه کد 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>
 
 
 
باید توجه داشت که در هنگام نصب یک CMS نباید از این دستور استفاده نمود.
البته شما می توانید از امکان URL Rewrite هم برای انجام این محدودیت استفاده کنید. استفاده از URL Rewrite بهتر است چون می تونید در صورتی که درخواست دسترسی به فایل یا پوشه مورد نظر از سمت مرور گر کاربر رسید، درخواست را به صفحه خطای مناسبی هدایت کنید.
نمونه کد Web.config با استفاده از URL Rewrite:
 
        <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>
 
در این مثال خطای 403 به کاربر نمایش داده می شود.
 
Default Document:
از طریق دستور Default Document می توانید نام فایلی که در لحظه دسترسی مرورگر به پوشه خاص باید نمایش داده شود را مشخص کنید. به عنوان مثال فرض کنید بصورت پیش فرض فایل index.php به عنوان Default Document معرفی شده اما شما می خواهید در پوشه admin فایل login.php را به عنوان Default Document معرفی کنید در این صورت می توانید از کد های زیر استفاده نمایید:
 
نمونه کد .htaccess:
 
# Set the default handler.
DirectoryIndex index.php
 
نمونه کد Web.config:
 
        <defaultDocument>
            <files>
                <remove value="index.php" />
                <add value="index.php" />
            </files>
        </defaultDocument>
 
 
URL Rewriting:
معمولی ترین کاربرد URL Rewrite برای تبدیل آدرسهای طولانی به آدرسهایی است که کوتاه هستند و به راحتی به خاطر سپرده می شوند. بر روی IIS هم می توانید افزونه URL Rewrite را نصب کنید. در Apache این امکان با نام mod_rewrite شهرت یافته ودر IIS به آن URL Rewrite گفته می شود. IIS توانایی خواندن و ترجمه کد های mod_rewrite به URL 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]
 
نمونه کد 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>
 
 
مدیریت صفحه های خطا:
بسیاری از سایت ها امروزه خطاهای رایج در وب سرور را مدیریت می کنند و به جای نمایش صفحه خطای وب سرور که برای کاربر نا آشنا می باشد صفحه کاربر پسند تری را نمایش می دهند. به عنوان مثال به جای نمایش خطای 404 که نشاندهنده این است که فایلی که مرور گر درخواست کرده پیدا نشده می توان صفحه ای کاربر پسند تر طراحی نمود و وب سرور را به صورتی هدایت نمود که در هنگام بروز این خطا صفحه طراحی شده ما را نمایش دهد:
 
نمونه کد .htaccess:
 
# Make Application handle any 404 errors.
ErrorDocument 404 /index.php
 
نمونه کد Web.config:
 
        <!-- 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>
        -->
این تنظیم به این دلیل کامنت شده که IIS برای مدیریت صفحه های خطا از دستور httpErrors استفاده می نماید اما این امکان در Application Level بصورت پیش فرض غیر فعال می باشد. ابتدا می بایست این امکان فعال شود و بعد از آن این کد از حالت کامنت خارج شود.
 
تنظیم مدت زمان نگهداری Cache:
دستورات Cache برای اطمینان از Cache کردن محتوای Static استفاده می شود و محتوای Dynamic هم به کلی Cache نمی شود. از طریق این دستورات ضمن فعال سازی Cache می توان مدت زمان نگهداری از این محتوای Cache شده را نیز مشخص نمود.
در فایل .htaccess مدیریت زمان بقای محتوای Cache شده توسط افزونه mod_expires کنترل می شود و در فایل IIS توسط افزونه Output Caching.
 
نمونه کد .htaccess:
 
# 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:
 
        <caching>
            <profiles>
                <add extension=".php" policy="DisableCache" kernelCachePolicy="DisableCache" />
                <add extension=".html" policy="CacheForTimePeriod" kernelCachePolicy="CacheForTimePeriod" duration="14:00:00:00" />
            </profiles>
        </caching>
 
 

Add Feedback