Tag Archive htaccess

rewrite url ใน iis

โดยปกติ PHP จะใช้ Apache HTTP Server เป็น server ถ้าต้องการให้ URL เรียบร้อยสวยงามก็ใช้ไฟล์ .htaccess แต่ถ้าเราใช้ Internet Information Services (IIS) ก็ต้องไปใช้ไฟล์ ที่คู่กันคือ Web.Config แทน

การที่จะ rewrite url ใน iis จะต้องมีการติดตั้ง URL Rewrite extension เอาไว้ก่อน

ตัวอย่างไฟล์ Web.Config ที่ทำหน้าที่ แปลง ค่าใน url ไปให้ไฟล์ index.php โดยที่จะซ่อนไฟล์ index.php ออกจาก url

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
   <system.webServer>
      <rewrite>
         <rules>
            <clear />
            <rule name="remove index.php" patternSyntax="Wildcard">
               <match url="*" />
               <conditions>
                  <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                  <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
               </conditions>
               <action type="Rewrite" url="index.php" />
            </rule>
         </rules>
      </rewrite>
   </system.webServer>
</configuration>

นำไปว่างใน folder ที่ต้องการใช้เช่น folder public ของ laravel เป็นต้น

Yii2: pretty urls

โดยปกติ url ของ yii2 จะเป็นแบบ http://localhost/BanBan/1/backend/web/index.php?r=gii%2Fdefault%2Fview&id=model ซึ่งยากที่ user ทั่วไปจะจำ ทำให้ google มองว่าเว็บเราใช้งานยากจึงไม่เป็นผลดีในการทำ seo เราจึงต้องแปลง query string ให้เป็นรูปแบบ pretty urls ที่จะจำได้ง่ายและสวยงามกว่า พี่เกิ๊ลชอบ

  1. เปิดไฟล์ config\main.php จากนั้นเพิ่ม
        'components' => [
    ...
            'urlManager' => [
                'enablePrettyUrl' => true,
                'showScriptName' => false,
            ],
    ...
        ],
  2. จากนั้นสร้างไฟล์
    RewriteEngine on
    
    # if a directory or a file exists, use it directly
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    
    # otherwise forward it to index.php
    RewriteRule . index.php

    save ไปที่ backend\web และ frontend\web

เท่านี้จาก url ยาวๆ ก็จะสวยงามขึ้นกลายเป็น http://localhost/BanBan/1/backend/web/gii/model อ่านง่ายขึ้นเยอะเลย

PHP: upload ไฟล์ขนาดใหญ่

การอัพโหลดไฟล์ขนาดใหญ่เกินกว่าที่อนุญาตไว้ใน php.ini สามารถแก้ได้หลายวิธี

  • กำหนดใหม่เฉพาะที่ใช้

    เพิ่ม code เข้าไปก่อนที่จะดำเนินการกับไฟล์ขนาดใหญ่เป็นพิเศษ วิธีนี้จะมีผลแค่ในส่วนที่เรากำหนดเท่านั้นเป็นวิธีที่ปลอดภัยที่สุด

    <?php
    ini_set('max_execution_time', '300');
    ini_set('post_max_size', '64M');
    ini_set('upload_max_size', '64M');
  • ใช้ไฟล์ .htaccess

    ใช้ได้กับเซิฟเวอร์ที่ใช้ apache เท่านั้น กำหนดโดยใส่ไว้ในไฟล์นามสกุล .htaccess

    RewriteEngine On
    
    # if not root directory
    #RewriteBase /
    
    # upload larage file
    php_value max_execution_time 300
    php_value max_input_time 300
    php_value post_max_size 64M
    php_value upload_max_filesize 64M
  • กำหนดใน php.ini

    จะมีผลกับทุกๆส่วนในเซิฟเวอร์ เพราะฉะนั้น ถ้าไม่ใช่ server ของตัวเองหรือเป็น private server แล้วอาจจะไม่สามารถใช้วิธีนี้ เพราะผู้ดูแลระบบมักจะไม่ให้แก้ไขในส่วนนี้ ยกเว้นในบาง server เช่น fatcow ยอมให้แก้ไขค่าตั้งต้นได้ แต่เซิฟเวอร์ไทยไม่เคยเจอที่ไหนยอมให้แก้ไข

    max_execution_time = 300
    post_max_size = 64M
    upload_max_filesize = 64M

การทดสอบดูว่าสามารถกำหนดค่าใหม่ได้จริงๆ รึเปล่าทำได้โดยเรียกใช้ function phpinfo() ค่าที่เปลี่ยนจะอยู่ใน column Local Value แถว max_execution_time, post_max_size, และ upload_max_filesize

เขียนหน้า 404 แบบง่ายๆ

เป็นธรรมดาที่เวลาเว็บมีอายุนานๆ แล้วจะมีการที่เพิ่มลดหน้าเพจ มีภาพที่โดนลบออก มีโดนย้ายตำแหน่ง รวมถึงพวก hacker ที่พยามจะมาเดินเล่นหา file ต่างๆ ที่อาจจะสามารถใช้รวบรวมข้อมูลไปทำอันตรายต่างๆได้ หลายๆเว็บจึงทำหน้า 404 not found ไว้ เพื่อ

  • บอกว่าไฟล์นี่ไม่มีแล้วนะ
  • พา user ไปหน้า search ข้อมูล หรือหน้าที่รวมความช่วยเหลือ
  • ป้องกันไม่ให้มาค้นหาไฟล์อะไรง่ายๆ โดยการเดาชื่อไฟล์ เพราะจะได้หน้านี้กลับไป เป็นการถ่วงเวลาอย่างหนึ่งให้ระบบตรวจจับการบุกรุกสามารถเห็นได้ง่ายขึ้น

    สร้างไฟล์ .htaccess ไว้ใน folder หลักของเว็บ หรือ directory ที่ต้องการ โดยเขียน

    RewriteEngine on
    
    RewriteRule (.*) 404.html [L]
    

    ถ้ามีคำสั้่งอื่นๆ อยู่แล้ว ก็ให้ใส่คำสั่ง RewriteRule (.*) 404.html [L] ไว้ล่างสุด และเขียนไฟล์ 404.html ไว้เนื้อหาภายในก็เปลี่ยนไปตามจุดประสงค์ที่ต้องการ จะแค่ภาพ 404 ที่มีตามเน็ตก็ได้

default file รูปด้วย .htaccess

ทำระบบสมาชิกโดยแต่ละ user จะมีภาพประจำตัว โดยเก็บในรูปแบบ \datas\peoples\id ของ user.jpg แต่บางคน (ส่วนใหญ่) ไม่ส่งภาพมา แต่ในหลายๆ หน้าจะมีจุดที่แสดงภาพสมาชิก

มี 2 ทางเลือกคือ

  • ใช้คำสั่ง file_exists ตรวจสอบดูว่ามีไฟล์นี้รึเปล่า ถ้ามีก็เอาภาพไปแสดง ถ้าไม่ก็แสดงภาพเป็นเงาดำๆ ให้ดูไป
  • อีกวิธีคือ แสดงภาพเหมือนว่ามีไฟล์นี้จริงๆ แต่ถ้าหาไฟล์ไม่เจอก็ให้ server ไปดึงไฟล์ดีฟอล์ตมาแสดง โดยใน code ไม่ต้องตรวจสอบอะไรเลย

วิธีการคือ สร้างไฟล์ .htaccess ใน \datas\peoples\ โดยมีเนื้อหาคือ

RewriteEngine on

# If requested resource exists as a file or directory go to it
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule (.*) - [L]

# Else rewrite requests for non-existent .jpg to default.jpg
RewriteRule (.jpg$) default.jpg [L]

# Else rewrite requests for non-existent resources to 404.html
RewriteRule (.*) ../404.html [L]

เมื่อมีการเรียกใช้ภาพ .jpg มาใน folder \datas\peoples\ ตัว apache จะไปหาก่อนว่าไฟล์นั้นมีหรือเปล่า ถ้าไม่มีก็จะใช้ไฟล์ default.jpg มาแสดงแทน แค่นี้ก็ไม่ต้องตรวจสอบทุกจุดที่แสดงภาพแล้วว่ามีภาพจริงๆ หรือเปล่า

ถ้าใช้ git อ่านเรื่อง git: ไม่สนไฟล์ในโพลเดอร์นี้ ยกเว้น ด้วย

จัดระเบียบเซิร์ฟเวอร์

ในครั้งแรกที่เราเรียนเขียนเว็บจะถูกสอนให้เก็บไฟล์ ในโฟลเดอร์ public_html หรือ www เพื่อจะได้เรียกใช้ได้จากเว็บ พอเว็บเราโตขึ้นมันทำให้สับสน และมีปัญหาตามมา เช่น

  1. จากที่อาจจะมีแค่ joomla อยู่อย่างเดียว ก็จะใส่ phpbb เพิ่มเข้าไป ถ้าไม่ย้ายไฟล์ joomla ไปไว้ใน folder ย่อย ก็ต้องใส่ phpbb ไปใน folder ย่อยเวลาจะเรียกใช้ก็เรียก domain1.com/phpbb  ถ้าไม่ถูกใจ phpMyAdmin ตัวเก่าๆที่ติดมากับโฮสต์ จะใช้ตัวใหม่ก็สร้าง folder phpMyAdmin ขึ้นมา ไปเรื่อยๆ แล้วมันจะมีปัญหาอะไรละ
    • ถ้าจะเปลี่ยนจากจูมล่าเป็น wordpress ก็ต้องมาหาว่า folder นี้เป็นของ joomla นะ ต้องดูให้แน่ใจว่ามันไม่ถูกใช้โดยโป��แกรมอ��่น จะท���้งไว้ก็เสียพื้นที่ไปเปล่าๆ
    • การ update อัตโนมัติของบางโปรแกรมอย่าง prestashop ให้วิธีลบทั้งโฟลเดอร์ออกไปทั้งหมด แล้วแตกไฟล์เข้าไปใหม่ ถ้าใน folder นั้นๆ มีไฟล์ของโปรแกรมอื่นละ มันก็ล่มโดยที่เราไม่รู้ตัว
    • บางครั้งโปรแกรมต้องใช้การ config ที่ต่างกัน อย่าง joomla จะเตือนถ้าพบว่า magic_quotes_gpc  เปิดอยู่ แต่โปรแกรมโบราณต้องเปิดไว้ ถ้าเราก็บแยกโพลเดอร์ก็สามารถใช้ .htaccess เปิดปิดได้ตามความต้องการ
  2. จะสร้างเว็บใหม่ ใช้ joomla เหมือนกัน ไว้ที่เดียวกัน บางครั้งสับสน ว่าโพลเดอร์นี้ เป็นของโดเมนไหน

ถ้าเราเก็บไฟล์โดยใช้รูปแบบ public_html/domain1.com, public_html/domain2.com, public_html/ domain3.com ก็จะแก้ปัญหาข้อ 2 ได้

ในแต่ละ domain ก็แบ่งย่อยเป็น joomla, phpbb อีก ให้โปรแกรมแต่ละตัวแยกอิสระต่อกัน

แต่ การที่จะให้ผู้ใช้ลูกค้าของเราดูเว็บ แบบ http://domain1.com/domain1.com/Joomla คงไม่ดีแน่ ทั้งในเรื่องความสะดวกและ SEO เราสามารถใช้ ไฟล์ .htaccess  point ชี้ root diretory ให้เราใหม่

  1. เปิดไฟล์ .htaccess ในโฟลเดอร์ public_html  ถ้าไม่มี ก็สามารถสร้างขึ้นมาใหม่ได้ ด้วย โปรแกรม notepad แล้ว save เป็นชื่อ .htaccess ตรง Save As Type เลือกเป็น All Files (*.*)
  2. พิมพ์ ตามตัวอย่างเลยครับ
    # BlueHost.com
    # .htaccess main domain to subdirectory redirect
    # Do not change this line.
    RewriteEngine on
    # Change example.com to be your main domain.
    RewriteCond %{HTTP_HOST} ^(www.)?example.com$
    # Change 'subdirectory' to be the directory you will use for your main domain.
    RewriteCond %{REQUEST_URI} !^/subdirectory/
    # Don't change the following two lines.
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    # Change 'subdirectory' to be the directory you will use for your main domain.
    RewriteRule ^(.*)$ /subdirectory/$1
    # Change example.com to be your main domain again.
    # Change 'subdirectory' to be the directory you will use for your main domain
    # followed by / then the main file for your site, index.php, index.html, etc.
    RewriteCond %{HTTP_HOST} ^(www.)?example.com$
    RewriteRule ^(/)?$ subdirectory/index.html [L]
    	

    copy คู่มือของเซิร์ฟเวอร์มานั่นละ แต่กลัวลืมเลยขอ note ไว้หน่อยหนึ่ง

  3. แก้ example.com เป็น domain ของเรา แก้ subdirectory เป็นโฟลเดอร์ของเรา
  4. ทดลองเข้า โดเมน domain ของเรา จะพบว่าเราเห็นไฟล์ในโฟลเดอร์ subdirectory อีกชั้นหนึ่งไม่ใช่ ตัว public_html

ปิด magic_quotes ด้วย htaccess

Joomla 3 จะมีปัญหาภาพไม่ขี้น ไม่สามารถติดตั้งได้ เพราะว่าเปิด magic_quotes_gpc ไว้ ถ้าเราไม่สามารถปิด ใน php.ini ได้ (เช่าแชร์เซิร์ฟเวอร์เค้าใช้ต้องทำใจ) หรือมีโปรแกรมโบราณสมัยพระเจ้าหลุยส์ที่สิบสามอยู่ด้วย ทำให้ปิดไม่ได้ เราก็สามารถทำได้ด้วยไฟล์ .htaccess

  1. เปิดไฟล์ .htaccess ในโฟลเดอร์ที่เก็บไฟล์จูมล่าไว้ ถ้าไม่มี ก็สามารถสร้างขึ้นมาใหม่ได้ ด้วย โปรแกรม notepad แล้ว save เป็นชื่อ .htaccess ตรง Save As Type เลือกเป็น All Files (*.*)
  2. พิมพ์
    # disabel magic_quotes for joomla
    php_flag magic_quotes off
    php_flag magic_quotes_gpc off
    php_value magic_quotes 0
    php_value magic_quotes_gpc 0