Bài 06: Một số thủ thuật với .htaccess
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 ...
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
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.