Bài 06: Một số thủ thuật với .htaccess

Htaccess 12/02/2017 07:00 962
Mình sẽ tổng hợp một số thủ thuật thường dùng trong file .htaccess. Cũng giống như Regular expression thì .htaccess nó không hề đơn giản. Có người nói chủ Htaccess làm chủ cuộc chơi. Nhưng cũng tùy theo ứng dụng của bạn đôi khi chỉ một vài dòng quy tắc đơn giản là xong. Đôi khi một mớ .htaccess hỗn độn.

1. Chuyển toàn bộ đến tên miền mới

Nếu bạn quyết định thay đổi tên miền thì các đường dẫn trước đây từ các website bên ngoài, từ máy tìm kiếm và ngay cả các đường dẫn tuyệt đối trên website cũ đều bị thay đổi và khi bạn truy cập, các địa chỉ trên sẽ trỏ bạn đến trang báo lỗi 404. Vì thế nếu bạn thay đổi tên miền thì đừng để mất các liên kết quí báu và người dùng tiềm năng từ máy tìm kiếm, hãy redirect các liên kết cũ tới tên miền mới:

Options +FollowSymLinks
RewriteEngine on
RewriteRule (.*) http://www.chiasephp.net/$1[R=301,L]

2. Redirect toàn bộ trang trong một thư mục đến một trang mới

Giả sử như bạn không còn sử dụng thư mục “hocphp” nữa và muốn chuyển tất cả các trang trong thư mục này đến trang “tut.php” thì hãy thêm dòng lệnh sau vào tệp tin .htaccess nằm tại thư mục gốc :

RewriteRule ^hocphp(.*)$ /tut.php [L,R=301]

3. Chuyển các trang động tới một trang mới

Để chuyến trang web động page.php?id=n (với n là giá trị biến) tới một trang tĩnh mới static.html thì bạn có thể làm như sau.

RewriteRule ^page.php?id=(.*)$ /static.html [L,R=301]

4. URL không www sang có www.

Đôi khi các bạn bắt gặp việc website có sử dụng “www” trong URL (Ví dụ http://www.chiasephp.net ), trong khi có những website lại không dùng “www” này như http://aevn.fr. Các bạn không thể chọn cả hai vì sẽ gây ra trùng lặp nội dung.

Options +FollowSymLinks

RewriteEngine On 
RewriteBase / 
RewriteCond %{HTTP_HOST} !^www\.chiasephp.net.\.net$ [NC] RewriteRule ^(.*)$ http://www.chiasephp.net/$1 [R=301,L]

Hoặc

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

5. URL có www sang không www.

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [L,R=301]
6. Loại bỏ Query_String

Đôi khi một trang web của bạn có thể hiển thị hai đường dẫn url khác nhưng cùng một nội dung ví dụ http://example.net/tut-php/ và http://example.net/tut-php/comments/page=2. Tương tự như phần trên, điều này sẽ tạo ra nội dung trùng lặp trên website của bạn. Vì vậy bạn có thể loại bỏ các tham biến như sau :

RewriteCond %{THE_REQUEST} ^GET\ /.*\;.*\ HTTP/ 
RewriteCond %{QUERY_STRING} !^$ 
RewriteRule .* http://www.chiasephp.net%{REQUEST_URI}? [R=301,L]

Ngoài ra nếu như tham biến QUERY_STRING không được gấn giá trị nào hết và URl kết thúc bởi biến rỗng “?”, thì bạn nên loại bỏ chúng, ví dụ “index.php?” :

RewriteEngine On 
RewriteBase / 
RewriteCond %{QUERY_STRING} . 
RewriteRule ^index.php /index.php? [L]

7. Chuyển phần đuôi mở rộng từ .php sang .html

Việc chuyển .php sang .html có tác dụng khi bạn cần viết lại đường dẫn thân thiện với máy tìm kiếm (Friendly URL for SEO).

RewriteRule ^(.*)\.html$ $1.php [R=301,L]

8. Chuyển gạch dưới (_) thành gạch ngang(-)

Dù Google mới chấp nhận việc sử dụng gạch dưới “_” như là ký tự ngăn cách, nhưng trong thực tế người dùng vẫn quen thuộc với dấu gạch ngang “-” hơn.

Options +FollowSymLinks 
RewriteEngine On 
RewriteBase / 
RewriteRule !\.(html|php)$ - [S=4] 
RewriteRule ^([^_]*)_([^_]*)_([^_]*)_([^_]*)_(.*)$ $1-$2-$3-$4-$5 [E=uscor:Yes] 
RewriteRule ^([^_]*)_([^_]*)_([^_]*)_(.*)$ $1-$2-$3-$4 [E=uscor:Yes] 
RewriteRule ^([^_]*)_([^_]*)_(.*)$ $1-$2-$3 [E=uscor:Yes] RewriteRule ^([^_]*)_(.*)$ $1-$2 [E=uscor:Yes] 
RewriteCond %{ENV:uscor} ^Yes$ 
RewriteRule (.*) http://www.chiasephp.net/$1 [R=301,L]
9. Chống Hotlink

Hotlink nghĩa là một tập tin của ta được đọc trực tiếp từ trang khác. Thí dụ: bạn có một ảnh JPEG rất đẹp 200KB ở máy chủ của bạn, nhưng người khác lại dùng thẻ để hiển thị hình ảnh này ở trang web của họ. Đây là hành vi ăn cắp băng thông của bạn, vì mọi người xem không ai biêt rằng cái ảnh đó của bạn, và bạn đã mất băng thông một cách vô ích. Rất may, hầu hết các trình duyệt khi yêu cầu một tập tin đều có gửi kèm một thông số cho biết nó được yêu cầu từ trang web nào. Vậy bạn chỉ cần đơn giản một câu kiểm tra là xong.

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?yoursite\.com.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://your-ip.*$ [NC]
RewriteRule .*\.(jpg|gif)$ http://www.example.com/hotlink.jpg [NC]

Trong đó hotlink.jpg là ảnh sẽ thay thể các ảnh kia (bạn có thể ghi một câu thông báo chẳng hạn vào tấm ảnh đó). Và tất cả ảnh được link đến từ trang khác sẽ không hiện ra, mà được thay bằng ảnh hotlink.jpg. Tất nhiên, bạn có thể sửa lại để ngăn các tập tin khác ngoài GIF và JPG. Đôi khi, bạn muốn chống hotlink trong một thư mục gallery thôi chẳng hạn, thì dòng cuối cần sửa lại thành:

RewriteRule .*gallery.*\.(jpg|gif)$ http://www.example.com/hotlink.jpg [NC]

Ngoài ra nếu bạn không muốn website của mình bị một website khác Iframe thì bạn có thể áp dụng một trong hai cách như sau.

Header set X-Frame-Options DENY

Trong đó:

  • DENY - This setting prevents any pages served from being placed in a frame even if it is on the same website it originates from. should be used if you never intend for your pages to be used inside of a frame.
  • SAMEORIGIN - This setting allows pages to be served in a frame of a page on the same website. If an external site attempts to load the page in a frame the request will be denied.
  • ALLOW-FROM origin - If the value contains the token ALLOW-FROM origin, the browser will block rendering only if the origin of the top-level browsing context is different than the origin value supplied with the Allow-From directive.

Hoặc trong trường hợp cụ thể bạn biết rõ website Iframe website của bạn. e.g bad.com

RewriteCond %{HTTP_REFERER} (www\.)?bad\.com [NC]
#then redirect to a different page
RewriteRule !^404.shtm [L,NC,R=302]

10. Chọn trang web theo thời điểm

Đoạn mã sau đây sẽ hiển thị trang homepage.htm nếu ai đó truy cập vào trang của bạn trong khoảng 5 đến 23 giờ và hiển thị trang sleeppage.htm nếu ai đó truy cập vào trang của bạn trong khoảng 1 đến 5 giờ.
RewriteEngine on

RewriteCond %{TIME_HOUR}%{TIME_MIN} >0459
RewriteCond %{TIME_HOUR}%{TIME_MIN} <2359
RewriteRule ^.*$ http://www.example.com/homepage.html

RewriteCond %{TIME_HOUR}%{TIME_MIN} >0100
RewriteCond %{TIME_HOUR}%{TIME_MIN} <0500
RewriteRule ^.*$ http://www.example.com/sleeppage.html

11. Tổng kết.

Trên đây mình tổng hợp một số thủ thuật với .htaccess. Nói cho cùng thì .htaccess cũng giống như Regular expression nó không hề đơn giản. Có người nói chủ Htaccess làm chủ cuộc chơi. Bạn sẽ hiểu một phần nào độ phức tạp của nó. Nhưng cũng tùy theo ứng dụng của bạn đôi khi chỉ một vài dòng quy tắc đơn giản là xong.

Xem Thêm

Profile photo of adminTheHalfHeart

B.V.T

Sinh ra và lớn nên ở Bắc Giang. Hiện tại thì tôi đang là một lập trình viên tại VietISO. Tôi lập website này với mục đích là bookmark những gì tôi đã đọc qua và mong muốn chia sẻ những gì tôi biết.