Apache

Apache the web server

How to do 301 Redirect with Apache mod_rewrite

โดยปรกติเวลาเราใช้ mod_rewrite เพื่อ redirect Apache จะส่ง HTTP Response Code เป็น 302 มาให้ client

ซึ่ง 302 นั้นหมายถึงว่าการ redirect นั้นเป็นแบบชั่วคราว มิใช่ถาวร
เมื่อ search engine crawler เข้ามาค้นข้อมูลก็จะยังเก็บ URL เก่าไว้ เพื่อเข้ามา crawl ในครั้งต่อไป

ดังนั้นถ้าเราต้องการย้าย website หรือ URL แบบถาวร เราควรจะใช้ HTTP Response Code 301 มากกว่า

สามารถทำได้โดยการเพิ่ม R=301 ใน Redirect option (ในก้ามปูท้ายบรรทัดนั่นแหละ) เช่น

RewriteRule ^/(.*)$ http://next.example.com/$1 [R=301,L]

Reference

Catch-all subdomain virtual web hosting

Catch-all (หรือ Wild card) คือการทำให้ web server ของเราสามารถรับ subdomain อะไรก็ได้
ตัวอย่างที่มักจะใช้งานแบบนี้ก็คือพวก community website, blog เช่น hi5 ก็จะมี subdomain ให้กับแต่ละ user เลย
อย่างของผมก็จะเป็น semicolonth.hi5.com (ไม่ต้องตามเข้าไปนะ ไม่ได้ update เลยครับ แบบว่า อาย)

แล้วเราจะทำอย่างไร ถึงจะได้แบบนี้มาหละ มามะ มาดูกันว่าทำอย่างไร

สมมติว่าต้องการ set up catch-all ให้กับ domain example.com

Set up DNS
เพิ่ม บรรทัดนี้เข้าไปใน zone file ของ domain example.com

*    IN  A  172.16.0.20

Apache - มาประหยัดการเขียน Log กันดีกว่า

(จะจัดเข้าหมวด Speedy Apache ดีไหมนี่)

เพื่อประสิทธิภาพที่ดีของ web server ของเรา
มาลดการเขียน log ลง disk กันบ้างดีกว่าครับ

ถ้าเรายังต้องการการ log ของ Apache อยู่
แต่ก็มีบาง request ที่ไม่ต้องการการเขียน log
เช่น ไฟล์รูปภาพ, CSS, JavaScript, ...

ให้ทำดังนี้ครับ
1. Set environment variable สำหรับ request ที่ match กับที่เราต้องการ

SetEnvIfNoCase    Request_URI    "\.(gif|jpg|png|js|css)$"     no_log_object

2. เพิ่ม env filter เข้าไปหลังบรรทัดที่ระบุการเขียน Log

CustomLog    /bla/bla/bla    combined     env=!no_log_object

Speedy Apache - Episode 2 - ถ้าไม่จำเป็น อย่าใช้ .htaccess

Speedy Apache - Episode 2 - ถ้าไม่จำเป็น อย่าใช้ .htaccess -- Get rid of .htaccess

ใน Website ที่อยู่ในช่วง Production แล้วถ้าไม่จำเป็นจริง ๆ ไม่ควรใช้งาน .htaccess
เนื่องจากการเปิดใช้ .htaccess นั้นจะทำให้ Apache จะต้องควานหา File .htaccess ทุกครั้งที่มีการ Request
ซึ่งก็แน่นอน การเข้าถึง File system ย่อมทำให้เกิดคอขวด ถึงแม้ว่ามันจะ Cache ได้ก็เถอะนะ

และสิ่งที่ต้องทำไม่ใช่แค่เอา File .htaccess ออกไปเท่านั้น
เราจะต้องแก้ไข httpd.conf ด้วย โดยให้

AllowOverride None

ตัว Apache เองจะได้ไม่พยายามอ่าน .htaccess อีกต่อไปครับผม

Speedy Apache: Episode 1 - เอา ETag ออกไป!

Speedy Apache - Episode 1 - เอา ETag ออกไป! -- Turn off ETag HTTP response header

Entity Tag (ETag) เปรียบเสมือนเลข Version ของ Content ที่จะส่งออกไปจาก Server

โดยถ้า Browser ส่งค่า If-None-Match (ETag ล่าสุดของ URL ที่ Browser Cache ไว้) มาด้วย
Server จะทำการเปรียบเทียบกับ ETag ที่คำนวณที่ Server ว่าเป็น Content ที่ใหม่กว่าที่ Browser Cache ไว้หรือไม่
ถ้าพบว่าค่า ETag เท่ากัน Server ก็จะส่ง status code 304 Not Modified กลับมาเพื่อบอก Browser ว่าไม่ต้องโหลดต่อให้ใช้ Content เดิมไป

หนึ่งในข้อควรระวังในการใช้ Apache Rewrite Engine

วันนี้ผมลอง Set RewriteRule ให้กับเวบของบริษัทตามนี้

RewriteRule ^/abc/([0-9]+)(\.html)?$ /home/abc.php?code=$1

และพบว่าทำอย่างไรมันก็ไม่สามารถทำงานได้ตามต้องการ
ทั้ง ๆ ที่ตรวจสอบจาก RewriteLog Apache ก็ทำการ Rewrite ให้เรียบร้อยแล้ว

ลองมั่วไปอีกหลายอย่าง เช่น
> เพิ่ม Flag T=application/x-httpd-php
> เปลี่ยน pattern ตรง abc ให้ไม่ตรงกับ abc.php ที่เป็นชื่อ script
Rewrite ก็ยังไม่ทำงานตามประสงค์

แต่เมื่อผมไปลองดู Log เทียบกับ Rewrite configuration ตัวอื่น ๆ พบว่าต่างกันนิดหนึ่งตรง

อันที่ใช้ได้นั้นจะมีบรรทัดนี้ด้วย

Syndicate content