Htaccess toàn tập!

 Những thủ thuật .htaccess bạn nên biết, Tối ưu và bảo mật website bằng file .htaccess, Cách Rewrite URL trong – Tạo đường dẫn thân thiện cho website

1.Những thủ thuật .htaccess bạn nên biết

Dòng lệnh bắt đầu .htaccess

Dòng lệnh .htaccess của bạn nên bắt đầu như sau :

RewriteEngine On RewriteBase /

Dòng lệnh cơ bản redirect 301

Dòng lệnh redirect 301 về cơ bản có dạng như sau trong tệp tin .htaccess :

redirect 301 /old/old.htm http://www.gocit.vn/new.htm

Dòng lệnh trên thông báo chuyển rời tệp tin old.htm trong thư mục old đến vị trí mới tạihttp://www.gocit.vn/new.htm.

Chú ý : Để bắt đầu thì bạn nên redirect 301 các trang trên cũng host, bạn chỉ nên chuyển các trang cũ đến thư mục gốc tương đối. Có thể thực hiện việc này bằng việc loại bỏ “http://www.gocit.vn/” mà chỉ thêm đường dẫn tương đối đến thư mục gốc.

Điểm mạnh nhât của việc thay đổi hàng loạt đường dẫn URL chính là mod_rewrite của Apache, đặc biệt là khi thay đổi tên miền hay thư mục hay số lượng lớn các tập tin. Chúng ta hãy tìm hiểu phần tiếp theo.

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 : trang không tìm thấy.

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.gocit.vn/$1 [R=301,L]

Hãy thay đổi http://www.gocit.vn bằng tên miền mới của bạn.

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 “thuthuatseo” nữa và muốn chuyển tất cả các trang trong thư mục này đến trang “seoblog.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 ^thuthuatseo(.*)$ /seoblog.php [L,R=301]

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 new-page.htmlthì bạn có thể làm như sau :

RewriteRule ^page.php?id=(.*)$ /new-page.htm [L,R=301]

URL với www hay không www

Đôi khi các bạn bắt gặp việc website sử dụng “www” trong URL (Ví dụ như http://truongchieu.byethost8.com), trong khi có những website lại không dùng “www” này như http://aevn.fr . Nên nhớ rằng “tương ứng” với dịch vụ Web. Các bạn có thể lựa chọn riêng cho mình. Nhưng không thể chọn cả hai vì sẽ gây ra trùng lặp nội dung. sau đây là hai ví dụ, hướng dẫn bạn sủ lý triệt để vấn đề này.

Trường hợp sử dụng www

Options +FollowSymLinks

RewriteEngine On

RewriteBase /

RewriteCond %{HTTP_HOST} !^www\.gocit.\.net$ [NC]

RewriteRule ^(.*)$ http://www.gocit.vn/$1 [R=301,L]

Ngoài ra còn có cách viết sau có thể áp dụng cho tất cả các host và domain, không phải edit lại :

Options +FollowSymLinks

RewriteEngine On

RewriteBase /

RewriteCond %{HTTP_HOST} !^www\.[a-z-]+\.[a-z]{2,6} [NC]

RewriteCond %{HTTP_HOST} ([a-z-]+\.[a-z]{2,6})$     [NC]

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

Trường hợp không sử dụng www

Options +FollowSymLinks

RewriteEngine On

RewriteBase /

RewriteCond %{HTTP_HOST} !^aevn\.fr$ [NC]

RewriteRule ^(.*)$ http://aevn.fr/$1 [R=301,L]

Bạn có thể thử lại với các tên miền ví dụ trên mà tớ áp dụng thành công đúng như trích dẫn.

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ụ seo-tools.php và seo-tools.php?v=mobile. Tương tự như phần trên, điều này sẽ tạp 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.gocit.vn%{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]

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]

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

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 “-”. Bản thân vietprotocol cũng ủng hộ dấu gạch ngang vì nó dễ nhìn hơn. Bạn có thể chuyển đổi toàn bộ dấu “_” sang “-” như sau :

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.gocit.vn/$1 [R=301,L]

Redirect WordPress Feeds tới Feedburner

Trong bài viết sử dụng Feedbuner, các bạn có thể sử dụng plugin để quản lý Feeds RSS trên Blog WordPress. Nếu không các bạn có thể sử dụng code htaccess sau :

RewriteEngine On

RewriteBase /

RewriteCond %{REQUEST_URI} ^/feed\.gif$

RewriteRule .* - [L]

RewriteCond %{HTTP_USER_AGENT} !^.*(FeedBurner|FeedValidator) [NC]

RewriteRule ^feed/?.*$ http://feeds.gocit.vn/support [L,R=302]

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule . /index.php [L]

Đối với người dùng WordPress, các bạn có thể sử dụng plug-in Redirection Permanent Link để chuyến hướng các trang.

Bào vệ ăn cắp tài nguyên và băng thông

Đôi khi các tài liệu, film hay hình ảnh mà bạn tải trên host của mình bị người khác dùng và đăng trên website khác sẽ gây tốn băng thông, bạn có thể hạn chế việc ăn cắp bằng cách chỉ cho phép các tài nguyên trên tiếp cận trên những website bạn cho phép như sau (Nếu không sẽ trả về thư mục /feed/) :

RewriteEngine On

RewriteBase /

RewriteCond %{HTTP_REFERER} !^$

RewriteCond %{HTTP_REFERER} !^http://(www\.)?gocit.vn/.*$ [NC]

RewriteRule \.(gif|jpg|swf|flv|png)$ /feed/ [R=302,L]

Ứng dụng redirect 301 trên các máy chủ khác (ngoài Apache)

IIS redirect

Trong phần quản trị dịch vụ internet, nhấn phải chuột chọn tệp tin và thư mục mà bạn muốn áp dụng redirect; Chon nút “a redirection to a URL”; Chọn trang Redirection; Chon tiếp “The exact url entered above” và “A permanent redirection for this resource”; Chon “Apply”.

ColdFusion Redirect

<.cfheader statuscode="301" statustext="Moved permanently">

<.cfheader name="Location" value="http://www.gocit.vn">

PHP Redirect

ASP Redirec

<%@ Language=VBScript %>

<% Response.Status="301 Moved Permanently" Response.AddHeader "Location","http://www.gocit.vn/" %>

ASP .NET Redirect

JSP (Java) Redirect

<% response.setStatus(301); response.setHeader( “Location”, “http://www.gocit.vn/” ); response.setHeader( “Connection”, “close” ); %>

CGI PERL Redirect

$q = new CGI;

print $q->redirect("http://www.gocit.vn/");

Ruby on Rails Redirect

def old_action headers[“Status”] = “301 Moved Permanently” redirect_to “http://www.gocit.vn/”

2.Tối ưu và bảo mật website bằng file .htaccess

Sử dụng file .htaccess để tối ưu và bảo mật website của bạn hơn: bảo vệ các file quan trọng, giới hạn upload, chuyển hướng 301, trang lỗi tùy chỉnh, tắt liệt kê nội dung thư mục, nén nội dung…

Chức năng: 1. Bảo vệ tệp tin 2. Tắt chữ ký số của web server 3. Giới hạn upload 5. Giới hạn quyền truy cập 6. Trang lỗi tùy chỉnh 7. Tắt liệt kê nội dung thư mục 8. Chuyển hướng 301 9. Chống ăn cắp băng thông như hình ảnh, video (bandwidth) 10. Bật nén PHP compression (bandwidth) 11. Thiết lập canonical url cho website

1.Bước 1, Tạo file .htaccess.

Mở Notepad hoặc phần mềm text editor. Lưu và Đặt tên file htaccess.txt. 2. Nhập nội dung vào file htaccess.txt.

# Bảo vệ file file htaccess

<files .htaccess> order allow,deny deny from all < /files>

#Tắt chữ ký số của web server

# disable the server signature ServerSignature Off

# limit file uploads to 10mb LimitRequestBody 10240000

# Bảo vệ file cấu hình config.php

<files config.php> order allow,deny deny from all < /files>

# Giới hạn truy cập, chặn IP

order allow,deny #deny from 000.000.000.000 allow from all

# Tạo Trang lỗi tùy chỉnh

# custom error docs ErrorDocument 404 /notfound.php ErrorDocument 403 /forbidden.php ErrorDocument 500 /error.php

# Tắt liệt kê nội dung thư mục

Options All -Indexes

# Chuyển hướng 301

Redirect 301 /old.php http://www.gocit.vn/new.php

# Khóa tên miền tham chiếu

RewriteEngine on RewriteCond %{HTTP_REFERER} digg\.com [NC] RewriteRule .* – [F]

Chống ăn cắp băng thông

#disable hotlinking of images with forbidden or custom image option RewriteEngine on RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http://(www\.)?gocit.vn/.*$ [NC] #RewriteRule \.(gif|jpg)$ – [F] #RewriteRule \.(gif|jpg)$ http://www.gocit.vn/images.gif [R,L] Nén file

# php compression – use with caution < ifmodule mod_php4.c> php_value zlib.output_compression 16386 < /ifmodule>

Tránh trùng lặp nội dung

# set the canonical url RewriteEngine On RewriteCond %{HTTP_HOST} ^yourdomain\.com$ [NC] RewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]

# Chống spam comments

RewriteEngine On RewriteCond %{REQUEST_METHOD} POST RewriteCond %{REQUEST_URI} .comments-post\.php* RewriteCond %{HTTP_REFERER} !.*yourdomain.com.* [OR] RewriteCond %{HTTP_USER_AGENT} ^$ RewriteRule (.*) ^http://%{REMOTE_ADDR}/$ [R=301,L]

3. Upload htaccess.txt lên server.

Sử dụng ftp client (sử dụng ASCII mode) và đổi tên file là .htaccess.

CHMOD file .htaccess sang 644.

4. Kiểm tra kết quả.

Apache cung cấp khả năng cấu hình qua những files truy cập siêu văn bản .htaccess., cho phép thay đổi tinh chỉnh của Apache (.conf). Đảm bảo file này được ấn định một mức độ bảo mật nhất định, tránh những truy cập bất hợp pháp từ bên ngoài (xem, sửa, xóa) những tinh chỉnh này.

1.Định nghĩa .htaccess:

Để làm được như vậy, trước tiên bạn cần chmod file .htaccess là 644, về chmod bạn có thể tìm hiểu ở nhiều tài liệu, hoặc google. .htaccess có tác dụng trên thư mục hiện hành (nơi chưa nó) và tất cả các thư mục con. Vì vậy, muốn sử dụng .htacess để quản lí truy cập vào website của mình, đơn giản bạn chỉ việc soạn thảo một file .htaccess, và lưu nó vào thư mục của website.

2.Comment trong .htaccess:

Nếu đã sử dụng và một lần sửa đổi cấu hình Apache thì chắc chắn bạn cũng biết, muốn sử dụng một module nào đó trong những available modules, bạn phải xóa dấu “#” (hash). Dấu “#” này dùng để định nghĩa một đoạn comment trong httpd.conf, và .htaccess cũng vậy. Một ví dụ:

CODE #Enable Rewrite mod << đây là comment, dòng này sẽ không được thực thi #trong .htaccess RewriteEngine on

3.Những chú ý quan trọng:.htaccess là một công cụ rất mạnh trong việc quản lí website. Một lỗi cú pháp nhỏ (thậm chí là một khoản trắng) cũng khiến website của bạn hoạt động không được bình thường như trước. Sau khi áp dụng .htaccess, bạn nên kiểm tra một lượt website của mình xem .htaccess có gây ra lỗi ở phần, trang con nào không? Do vậy trước khi làm việc với .htaccess, bạn nên backup cẩn thận dữ liệu của mình, nếu có trục trặc xảy ra, việc khôi phục trở nên đơn giản.

4.Vấn đề về performance: .htaccess cho phép bạn cấu hình mà không cần động chạm vào cấu hình chính của Apache. Tuy nhiên, về mặt hiệu năng và bảo mật, nếu có thể, bạn nên sử dụng httpd.conf hơn là sử dụng .htaccess. Cụ thể, khi được cấu hình để sử dụng .htaccess, thi Apache sẽ tìm kiếm tất cả những folder có chứa .htaccess để thực thi, và nó sẽ thực thi tất cả những file .htaccess tìm được. Do vậy, sẽ làm website của bạn trở nên ì ạch một cách không cần thiết. Nếu website của bạn là website cá nhân, hoặc ít người truy cập, thì đó là chuyện nhỏ. Nhưng nếu là một website đại chúng (báo điện tử, trang nhạc, film..) thì đây là một vấn đề rất lón. Do vậy .htaccess chỉ có tác dụng trong trường hợp bạn không có quyền cấu hình trên httpd.conf của Apache.

5.Những kí tự đặc biệt sử dụng khi cấu hình .htaccess

# Như đã nói ở trên, # đặt trước một dòng để định nghĩa dòng này là một đoạn comment, dòng này sẽ không được thực thi cho đến khi bạn xóa dấu “#” đi. Khi comment, bạn chỉ nên sử dụng các chữ cái, số, dấu gạch ngang hoặc gạch dưới để tránh những lỗi cú pháp không cần thiết.

[F]

Forbidden: Kí tự này dùng để chỉ định server sẽ trả về client trang lỗi 403 nếu truy cập vào những nơi không được phép

[L] Last rule: kí tự này để ấn định rằng bước trước đã xong thì ngừng và không tiếp tục thực thi lệnh rewrite tiếp theo nữa.

[N]

Next: chỉ thị cho server tiếp tục rewrite cho đến khi tất cả các mục chỉ định được rewrite hoàn toàn.

[G]

Gone: Chỉ định server trả về client trang báo lỗi không tồn tại (no longer exit)

[P]

Proxy: chỉ định server điểu kiển các yêu cầu được ấn định bởi mod_proxy

[C]

Chain: Chỉ định server thực hiện rule hiện hành song song với rule trước đó

[R]

Redirect: chỉ định server đổi hướng request sang một trang khác trong trường hợp trình duyệt gởi yêu cầu duyệt một trang được sửa chữa đường dẫn (rewrite) trước đó.

[NC]

No-case: Chỉ định server match những kí tự tương tự nhau, ví dụ dòng lệnh sau:

CODE RewriteCond %{HTTP_REFERER} !^http://domain.com/.*$ [NC] #Thì referrer là domain.com || Domain.com || DoMain.com…đều được match.

[PT]

Pass Through: có nghĩa là dùng kí tự để buộc “rewrite engine” ấn định bảng giá trị của uri trở thành giá trị của tên files

[OR]

Đây có thể gọi là một toán tử, các biểu thức được nối tiếp nhau bằng toán tử OR, trong đó biểu thức nào đúng, sẽ là quy tắc để lệnh Rewrite áp dụng. Ví dụ:

CODE RewriteBase / RewriteCond %{HTTP_USER_AGENT} ^Anarchie [OR] RewriteCond %{HTTP_USER_AGENT} ^ASPSeek [OR] RewriteCond %{HTTP_USER_AGENT} ^attach [OR] RewriteRule ^.* – [F,L]

Như vậy, mỗi dòng Rewritecond là một biểu thức chỉ định USER_AGENT, nếu bất cứ USER_AGENT nào match, thì RewriteRule sẽ được áp dụng, sau đó ngừng. Vì sao ngừng: Một request chỉ có một USER_AGENT, vì vậy không cần thiết phải quay trở lại kiểm tra các biểu thức còn lại, sẽ làm giảm hiệu năng phục vụ. Lời bàn:như ở trên đã nói, bạn chỉ sử dụng những chức năng này của .htaccess nếu không có quyền cấu hình trên Apache và firewall. Những chức năng lọc và chặn User agents Mod_ và Iptables đều có thể thực hiện được, vì vậy nếu đã có rule cho iptables và Mod_, việc thêm rule trên cho .htaccess là dư thừa, và không cần thiết.

[NE]

No Escape: Chỉ định server xử lí các gói tin trả về mà không dùng kí tự thoát

[NS]

No Subrequest: Chỉ định server bỏ qua thư mục hiện hành nếu request nhắm vào thư mục con.

[QSA]

Append Query String: chỉ định server gắn chuỗi truy vấn vào cuối cùng của URL

[S=x]

Skip: Chỉ định server bỏ qua không xem xét các X rules tiếp theo nữa nếu một rule đã được thực thi.

[T=MIME-type]

MIME-type: Khai báo định dạng files của server

[]

Chỉ định các kí tự đặt đặt trong [] sẽ được match. Cụ thể [xyx] thì các request có mang theo các kí tự x, y hoặc z sẽ được match.

[]+

Tương tự như trên, nhưng trong trường hợp này, nếu ta đặt [xyz]+ thì tất cả các request có mang theo kí tự x, y, z hoặc x’s, y’s. z’s hoặc sự kết hợp của x,y,z với bất kì kí tự nào đều được match. [^]

Ngược lại với [], các kí tự được đặt theo dạng [xyz^] sẽ không được match.

[a-z]

Dấu ‘-‘ đặt giữa 2 kí tự bên trong cặp dấu [] sẽ match tất cả các kí tự nằm trong khoảng từ kí tự đầu đến kí tự cuối. Ví dụ [a-bA-B] sẽ match tất cả các kí tự thường vào in hoa abcd và ABCD.

a{n}

Sẽ chỉ định chính xác n kí tự a được match. Ví dụ a{3} thì 3 kí tự a sẽ được match.

a{n,}

Tương tự như trên, nhưng trong trường hợp này sẽ match các kí tự a từ na trở lên.

a{n,m}

Chỉ định một khoảng chính xác các kí tự (m-n)a sẽ được match.

()

Nhóm các phương thức truyền dữ liệu (method). VD:

CODE RewriteCond %{REQUEST_METHOD} ^(HEAD|TRACE|DELETE|TRACK) [NC,OR] Các request bắt đầu (^) HEAD, TRACE, DELETE hoặc TRACK sẽ được match.

^

Bắt đầu bằng (xem ví dụ ở trên). $

Kết thúc bằng ( .*$: kết thúc bằng bất cứ gì) ?

Thường dùng chung với (), như trong trường hợp test(ti)? thì test hoặc ti sẽ được match.

!

Phủ định. VD: “!string” sẽ match tất cả các kí tự, ngoại trừ string –

Loại đi một chức năng, hoặc một rule đang thực thi nào đó. VD: CODE # không cho xem chỉ mục trong một folder nào đó Options All –Indexes

+

Chỉ định 1 hoặc nhiều kí tự cho trước sẽ được match. Hoặc thêm một chức năng nào đó VD: G+ sẽ match tất cả các kí tự G, Gs, Gx, G..

*

Tất cả đều được match. Ví dụ: CODE RewriteCond %{HTTP_REFERER} !^http://domain.com/.*$

Thì tất cả request files không mở đầu bằng _http://domain.com đều được match.

|

Hoặc. Ví dụ x|y thì hoặc x hoặc y sẽ được match.

\

Kí tự thoát. VD: www\.domainname\.com Chỉ có www được match, chứ không có wwww hoặc wwwww, domainname chứ không có domainnames hoặc domainnamex… -d

Kiểm tra thư mục có tồn tại hay không? -f

Kiểm tra file có tồn tại hay không

-s

Kiểm tra giá trị của file có khác 0 hay không?

6. Mã chuyển hướng trang báo lỗi

– 401 – Authorization Required : Lỗi chưa được xác thực user và – 400 – Bad request : Lỗi truy cập không hợp lệ, do server không chấp nhận request, hoặc request thiếu một số yêu cầu nào đó. – 403 – Forbidden : Lỗi truy cập vào trang bị cấm – 500 – Internal Server Error : Lỗi do server – 404 – Wrong page : Lỗi truy cập vào trang không tồn tại -301 – Moved Permanently: 302 – Moved Temporarily: Lỗi truy cập vào trang đã bị di chuyển.

3. Cách Rewrite URL trong PHP – Tạo đường dẫn thân thiện cho website

Nhiều bạn thiết kế website hỏi làm sao tạo được các đường dẫn đẹp (URL Rewrite). Trước tiên chúng ta tìm hiểu cơ chế rewite: Rewrite Engine là một phần dịch vụ của Webserver được dùng để thay đổi URL(đường dẫn trên trình duyệt) sang một dạng khác với nhiều mục đích khác nhau.

Kỹ thuật được nói đến là URL rewriting và nó đem lại những tiện lợi sau:- Làm cho URL trở nên thân thiện với người dùng cũng như dễ dàng với các Search Engine (bộ máy tìm kiếm)- Tránh lộ các đường link quan trọng- Tránh lộ các công việc bên trong trước người dùng

Bản chất của việc rewrite này các bạn có thể hình dung như sau: khi bạn gõ 1 đường link lên trình duyệt như sau: http://vidu.com/news/2007/13/01 thì đây là đường dẫn ảo, và khi request đến Webserver nó sẽ đổi lại thành đường dẫn thật như sau: http://vidu.com/index.php?mod=news&y…ay=13&month=01 << có thể là như thế này vì có nhiều cách rewrite.

Đối với Server Apache: để thực hiện được URL Rewriting bạn làm các bước sau:

1. Kích hoạt mod mod_rewrite có sẵn trong Apache bẳng cách sửa trong file httpd.conf, bạn Find đến dòng chưa rewrite_module rồi bỏ dấu # (nếu có) ở đầu đi. Sau đó restart Apache. Nếu bạn dùng các host trên internet thì có thể đã có sẵn rồi.

2. Tạo 1 file .htacces có nội dung như sau: Đầu tiên bật Rewrite Engine:

PHP Code:

RewriteEngine on Options +FollowSymlinks RewriteBase /

Tiếp đến là viết cú pháp RewriteRule:

PHP Code:

RewriteRule ^Virtual_Path Real_Path 

Ví dụ:

PHP Code:

RewriteRule ^topic_([0-9]*).html index.php?topic=$1 

ví dụ: topic_1.html thành index.php?topic=1

PHP Code:

RewriteRule ^article/([0-9]*)/page/([0-9]*) index.php?article=$1&page=$2 

ví dụ: article/1/page/2 thành index.php?article=1&page=2

Cú pháp để viết các Rule này giống như cách viết của biểu thức chính quy Regular Expression. ví dụ như sau:

(.*) nhận tất cả các giá trị. ([0-9]*) chỉ nhận các giá trị là số, từ 0-9. ([a-zA-Z]*) chỉ nhận các giá trị là chữ cái, từ a-z và A-Z.

3. Sau khi tạo được file htaccess bạn copy nó vào thư mục gốc của web của bạn là có thể chạy được.

Đối với Server IIS: các bạn download gói cần thiết về để có thể thực hiện được việc rewrite, các bạn có thể download từ 1 số trang sau:

http://www.micronovae.com/ModRewrite/ModRewrite.html http://www.qwerksoft.com/products/iisrewrite/ http://www.isapirewrite.com/ http://www.motobit.com/help/url-repl…od-rewrite.asp

Ngoài việc sử dụng mod url_rewrite như trên thì nếu host của bạn ko có kích hoạt mod này hoặc bạn ko có quyền để cấu hình nó như trên. Để đơn giản các bạn có thể tạo ra những cách khác nhau để làm cho URL trở nên đẹp và thân thiện hơn. Dưới đây là 1 số cách khác nhau.

c1 dạng như sau: http://vidu.com/index.php/news/2007/13/01 << Trông rất giống với kiểu rewrite ở trên nhưng nó khác ở chỗ nó là đường dẫn thật còn url rewrite là đường dẫn ảo. Đường dân này hiểu như là 1 request đến file index.php với Query String (Xâu truy vấn) là /news/2007/13/01, các bạn tách xâu này ra rồi sử dụng theo mục đích của mình. Cách này đang được trang web 24h.com.vn sử dụng.

c2 dạng như sau: http://vidu.com/index.php/news_2007_13_01.html << Gần giống cách 1 ở trên nhưng đường dẫn khác thân thiện với đuôi html, dễ dàng cho các search engine (máy tìm kiếm như Google, Yahoo) tìm kiếm nội dung.

c3 có thể viết như sau: http://vidu.com/index.php?q=news/2007/13/01 << cũng gần giống cách 1 nhưng nó rõ ràng hơn, nó được dùng trong FrameWork Drupal của PHP.

Và có thể có nhiều cách khác nhau các bạn có thể tự nghĩ ra. Hoặc có thể dùng cách mã hoá xâu truy vấn chẳng hạn.

[SEO] Thủ thuật với .htaccess cần biết

File .htaccess(hypertext access) của apache là một công cụ cực kỳ hữu dụng.

File .htaccess thường được tìm thấy trong thư mục root của website, bạn có thể dễ dàng sửa chữa nó bằng bất kỳ text editor nào. Bạn nên sao lưu lại file .htaccess của mình trước khi thử nghiệm các cách hack dưới đây.

1. Ngăn chặn hotlink

Nhiều người copy ảnh từ server của bạn và đưa lên trang web của họ. Thêm vào .htaccess đoạn mã dưới đây sẽ giúp bạn ngăn chặn ảnh hiển thị trên website khác

Tối ưu hóa hiệu suất máy chủ Apache

Việc tối ưu hóa hiệu suất của máy chủ Apache có thể tạo nên sự khác biệt về website của bạn và ấn tượng mà nó tạo ra, đặc biệt trên các site động. Trong bài này chúng tôi sẽ giới thiệu cho các bạn những vấn đề cơ bản trong cấu hình và cài đặt, hai lĩnh vực mà bạn có thể kiểm soát để tối ưu hóa hiệu suất của máy chủ Apache.

Việc đánh giá và cải thiện hiệu suất

Apache được thiết kế để có được tốc độ nhanh ở mức có thể. Mặc dù vậy, khi các site trở nên phức tạp và nhu cầu băng thông của kiểu kết nối khác nhau tăng lên, khi đó việc có được hiệu suất tốt nhất trong một cài đặt Apache và website trở thành một vấn đề quan trọng.

Việc nâng cao hiệu suất không có nghĩa là thực hiện những thay đổi để đạt được những thành quả không đáng kể. Việc tiêu tốn hàng giờ hoặc thậm chí nhiều ngày vào việc điều chỉnh một máy chủ cho một vài phần trăm là hành động lãng phí thời gian. Vì vậy, bước đầu tiên là bạn cần phải xác định máy chủ đang hoạt động của mình nhanh đến cỡ nào và mức hiệu suất nói chung của nó ra sao để có thể cải thiện hiệu suất và đánh giá được những thay đổi của mình.

Đây không phải là lần đầu tiên chúng tôi giới thiệu về việc test Apache. Như được lưu ý ở trên, việc xác định thành phần nào trong các ứng dụng web đang gây ra vấn đề – đặc biệt việc phân biệt xem liệu Apache hoặc môi trường ứng dụng mà bạn đang sử dụng với các site động là rất khó khăn. Việc nhận ra các vấn đề trong các ứng dụng động vượt ra ngoài phạm vi của bài này, tuy nhiên chúng tôi sẽ giới thiệu cho các bạn một số cách để cải thiện nói chung tốc độ của Apache và cách nó tương tác với các thành phần khác để hỗ trợ một website như thế nào.

Phần cứng máy chủ

Máy tính và môi trường hệ điều hành mà Apache đang chạy có ảnh hưởng lớn nhất. Rõ ràng rằng, một máy tính 386 cũ sẽ không thể cho hiệu suất tốt bằng một máy tính P4 hoặc dual-processor, tuy nhiên bạn có thể thực hiện một số cải thiện cho nó. Để tránh thay đổi phần cứng, thứ lớn nhất mà bạn có thể thực hiện là bảo đảm Apache đang chạy trên một máy chủ chuyên dụng. Thêm vào đó sự tồn tại các ứng dụng khác cũng ảnh hưởng đáng kể tới hiệu suất của máy chủ web.

Trong hầu hết các tình huống, đặc biệt là các website tĩnh, số lượng RAM là một hệ số quan trọng vì nó sẽ ảnh hưởng đến lượng thông tin mà Apache có thể nhớ (cache). Càng nhiều thông tin được cache thì hiệu suất của Apache trong việc xử lý mở và đọc một file nào đó trên đĩa sẽ càng thấp đi. Nếu site dựa trên hầu hết các file tĩnh, khi đó nên xem xét đến việc sử dụng mod_cache; nếu có khá nhiều RAM, khi đó bạn có thể cân nhắc đến mod_mem_cache.

Việc lưu thông tin vào đĩa trước đây tạo một khác biệt đáng kể nếu site dựa trên mod_include để xây dựng lên một trang. Với mod_mem_cache, các thông tin được lưu trong heap nhớ được chia sẻ bởi tất cả các quá trình của Apache.

Sử dụng đĩa tốc độ cao sẽ tốt hơn, giải pháp Redundant Array of Inexpensive Disks (RAID) là một trong những giải pháp được lựa chọn (RAID 0, 0+1, 5, 10, hoặc 50) sẽ cải thiện được tốc độ truy cập đến các file được phục vụ.

Mặc dù vậy cần lưu ý nếu bạn bị sự cố ở một truyến nào đó, thì một giải pháp phần cứng thay thế cho phần mềm là lựa chọn tốt nhất.

Cuối cùng, về mặt phần cứng, hiệu suất CPU có thể có sự ảnh hưởng trên các site động với các overhead phụ cho việc thực thi ứng dụng cho mỗi trang được truy cập. Các trang động thường yêu cầu CPU cao hơn.

Môi trường host

Không quan tâm đến hệ điều hành, bạn hãy sử dụng nguyên lý tối ưu dưới đây:

  • Giữ các ứng dụng background ở mức tối thiểu. Nếu bạn thực sự quan tâm đến vấn đề hiệu suất thì trước tiên cần phải xem xét đó là một số quá trình hoạt động ở chế độ background. Cho ví dụ, trong Unix, bạn nên tắt NFS, các dịch vụ in ấn và thậm chí cả sendmail nếu không cần thiết. Trong Windows, sử dụng System control panel để tối ưu hóa hệ thống cho các ứng dụng và cache hệ thống, tối ưu hệ thống về hiệu suất. Chỉ cần bảo đảm rằng các ứng dụng và các dịch vụ yêu cầu như MySQL vẫn đang chạy.
  • Tránh sử dụng hệ thống. Nếu bắt đầu biên dịch các ứng dụng, chỉnh sửa file hay sử dụng máy thì chắc chắn hiệu suất phục vụ web của máy sẽ giảm. Do đó nếu bạn phải chỉnh sửa các thành phần hoặc cài đặt phần mềm, hãy xây dựng hoặc chỉnh sửa các thành phần trên máy tính khác sau đó copy chúng sau.
  • Cần cập nhật liên tục hệ thống. Dẫu ý tưởng xuất phát từ quan điểm bảo mật nhưng việc nâng cấp phần mềm và cập nhật các bản vá cũng cải thiện đáng kể hiệu suất vào ra và hiệu suất mạng.

Ứng dụng Apache

Rõ ràng Apache cũng là một ứng dụng. Do đó đầu tiên cần bảo đảm nó được xây dựng đúng chỉ với các modul và các thành phần mở rộng cho các website. Điều đó có nghĩa rằng, cho ví dụ, bạn có thể bỏ qua các model ghi lại nếu không cần thiết. Lợi ích chủ yếu của việc đó là giảm được tải bộ nhớ, nhưng một lợi ích tốt nữa là bạn không thể kích hoạt vô tình các tùy chọn và do đó làm giảm hiệu suất máy chủ.

Tĩnh và động

Khả năng linh hoạt là vấn đề chủ yếu của hầu hết các quản trị viên Apache, tuy nhiên khả năng linh hoạt có giá của nó. Việc sử dụng các modul được load động bên trong Apache sẽ tạo sự thuận tiện nhưng chúng cũng ảnh hưởng đến hiệu suất, vì mã sẽ được nạp khi modul yêu cầu. Các modul động cũng có ưu điểm trong việc giữ cho các yêu cầu bộ ở thấp.

Để xây dựng một chế độ tĩnh, sử dụng kịch bản cấu hình và chỉ định các modul mà bạn muốn, tuy nhiên không chỉ định chia sẻ (chẳng hạn như sử dụng enable-rewrite mà không sử dụng –enable-rewrite=shared, hay sử dụng tùy chọn chia sẻ –enable-so).

Cấu hình modul

Nếu đang sử dụng cấu hình tĩnh của Apache, hãy chọn các modul mà bạn muốn hợp nhất để chăm sóc. Sử dụng chế độ tĩnh cũng phải trả giá – càng nhiều modul thì càng tốn nhiều bộ nhớ. Như vậy, một modul đa xử lý có thể sẽ có hiệu quả đáng kể trên các yêu cầu bộ nhớ của máy.

Lưu ý rằng có một số mục được đưa vào tự động, vì vậy bạn cần kích hoạt một cách rứt khoát và vô hiệu hóa các modul cần thiết. Cũng cần nhớ gộp các modul của các hãng thứ ba (chẳng hạn như thẩm định, PHP hoặc mod_perl), các yêu cầu dịch vụ web. Sử dụng cấu hình –help để có được danh sách các tùy chọn có sẵn.

Cấu hình máy chủ

Khi môi trường của bạn được thiết lập và ứng dụng Apache của bạn được tối ưu, đây chính là lúc bạn để ý đến file cấu hình để có những điều chỉnh tối ưu mạnh mẽ hơn. Một cách tốt là bắt đầu bằng cách dọn dẹp file để chỉ thị (directive) được giới hạn ở con số vài trăm bằng cách remove các chú thích. Ngoài ra, nó sẽ trở thành việc remove các thành phần không cần thiết hoặc các thành phần không cung cấp các lợi ích đích đáng.

Đơn giản hóa file cấu hình

Bước đầu tiên để tối ưu hóa là đơn giản hóa file cấu hình. Tuy sẽ không có những tiến bộ rõ nét về hiệu suất nhưng nó sẽ làm cho file cấu hình trở nên dễ dàng hơn trong sư dụng và vì vậy bạn sẽ tránh được trường hợp bỏ sót chỉ thị hoặc thành phần cần thay đổi.

Nếu thực hiện bất kỳ kiểu tối ưu nào, hãy bắt đầu với một trong các file cấu hình được cung cấp mặc định. Các file mày thường được lưu trong thư mục cấu hình Apache dưới tên httpd.conf.orig hoặc httpd-std.conf. Không nên sử dụng file high performance-std.conf; về lâu dài nó không thực sự hữu ích như những gì bạn nghĩ khi bắt đầu thêm vào một số lượng lớn các thông tin cấu hình bổ sung. Mặt khác, nếu mục tiêu của bạn là một máy chủ web tĩnh, tốc độ thì đây chắc chắn là cách dễ dàng nhất để bạn thực hiện được điều đó.

Nếu biết các chỉ thị cấu hình Apache, hoặc sẵn lòng nghiên cứu tài liệu, bước hiệu quả nhất và nhanh nhất mà bạn nên làm là remove tất cả các comment từ file cấu hình, vì chúng thường làm giảm uy tín các chỉ thị thực. Bạn cũng có thể remove các tham chiếu đến các hệ thống MPM hiện không sử dụng trên platform đã chọn.

Vô hiệu hóa các thành phần và hệ thống

Giờ đây chúng ta đã có một file cấu hình đơn giản, hãy bắt đầu remove các thành phần cấu hình cho các hệ thống hiện không sử dụng. Cụ thể như:

  • HostnameLookups, thành phần thường sẽ thêm overhead vào mỗi yêu cầu bằng cách yêu cầu tra cứu DNS trên máy khách, đầu tiên quan sát để tìm tên từ địa chỉ IP, sau đó tra cứu để chắc chắn thông tin đó không bị nhầm. Trong hầu hết các trường hợp, bạn có thể đơn giản vô hiệu hóa. Nếu thường xử lý với các file bản ghi của mình, bạn hãy sử dụng post-processing để xác định thông tin. Để vô hiệu hóa các tra cứu, nhóm chỉ thị dưới đây HostnameLookups off.
  • Symbolic links, đây là thành phần khi kích hoạt, sẽ làm cho Apache kiểm tra mọi yêu cầu để xác định xem liệu một liên kết tượng trưng có liên quan trong yêu cầu hay không. Trừ khi bạn thực sự cần đến các liên kết tượng trưng này, bằng không hãy tắt bỏ bằng cách  sử dụng: :<Directory /> Options -FollowSymLinks </Directory>
  • Server status and info, đây là một thành phần mặc dù rất hữu dụng khi test và kiểm tra máy chủ, nhưng nó sẽ tạo thêm overhead cho máy chủ web. Vô hiệu hóa bằng cách tìm kiếm các chỉ thị SetHandler server-status, và nếu có thể, remove modul từ Apache khi bạn cấu hình ứng dụng trong suốt quá trình xây dựng.
  • Wildcards và các tùy chọn linh hoạt cần được tránh nếu bạn có thể. Cho ví dụ, chỉ thịDirectoryIndex, sẽ chỉ thị rõ ràng danh sách các file được cấu hình, luôn liệt kê lựa chọn phù hợp nhất đầu tiên.
  • CGI execution cần có trừ khi bạn có một lý do tốt nào đó không thực hiện như vậy. Đặt tất cả các file CGI vào một thư mục và cấu hình nó cho thực thi CGI. Điều này sẽ tránh cho Apache có gắng xác định xem yêu có phải quả thực cho thành phần CGI hay không hay là một file tĩnh nào đó.

Vô hiệu hóa bản ghi

Việc ghi thông tin bản ghi là một quá trình tiêu tốn khá nhiều thời gian. Mặc dù vậy Apache luôn để mở tính năng này, do đó nó sẽ ngốn nhiều thời gian của máy chủ. Nếu việc lưu các thông tin bản ghi là không cần thiết, bạn có thể tiết kiệm được một vài chu trình xử lý bằng cách vô hiệu hóa nó. Để thực hiện điều này, hãy ghi chú các dòng bản ghi trong file cấu hình.

Nếu bạn quyết định giữ các bản ghi của mình, vô hiệu hóa HostnameLookups (xem bên trên) và bảo đảm copy các thông tin bản ghi ra một máy khác để phân tích các file.

Đơn giản hóa cấu hình mức thư mục

Các file .htaccess là các file rất hữu dụng cho việc mở rộng các tham số cấu hình máy chủ Apache mà không cần phải chỉnh sửa file cấu hình chính mỗi khi bạn muốn thay đổi thứ gì đó. Tuy nhiên vấn đề ở đây là việc sử dụng chúng sẽ làm chậm máy chủ của bạn.

Đầu tiên, máy chủ phải quan sát xem liệu file .htaccess có tồn tại hay không, sau đó nó phải phân tích cú pháp và xử lý các thành phần này trước khi sử dụng cấu hình cho thư mục đang được nói đến. Tồi tệ hơn, Apache phải xác định thông tin này không chỉ cho thư mục hiện hành mà còn cho cả các thư mục cha và sau đó phải tạo những thay đổi dựa trên nội dung của tất cả các file này.

Mặc dù vậy, nếu muốn tối đa hóa hiệu suất, bạn nên vô hiệu hóa việc sử dụng các file .htaccess. Bất cứ cấu hình thư mục cụ thể nào cũng đều có thể đi vào file cấu hình chính, nơi nó có thể được phân tích cú pháp một lần bởi Apache khi máy chủ bắt đầu.

Để vô hiệu hóa .htaccess thêm chỉ thị AllowOverride None và các phần <Directory>.

Cấu hình MPM

Multi-Processing Module (MPM) cho phép một nền tảng cụ thể có thể quản lý nhiều kết nối đồng thời. Các modul MPM cụ thể cho từng nền tảng. Các giải pháp có sẵn làm việc một cách đặc trưng với Unix, Windows, BeOS và NetWare. Với một số nền tảng thường có nhiều sự lựa chọn. Đối với hầu hết người dùng, cấu hình mặc định cho môi trường cụ thể nào đó làm việc khá tốt, đặc biệt khi việc có được các tham số chính xác có thể là một nhiệm vụ tốn thời gian. Bằng cách so sánh, nhiều kỹ thuật đã được mô tả có thể mang lại hiệu suất tốt hơn, tuy nhiên khi muốn có được hiệu suất tối đa cho máy chủ của mình thì bạn vẫn phải điều chỉnh cấu hình.

Dưới hầu hết các nền tảng chỉ có MPM, Unix có hai tùy chọn prefork và worker. MPM preforkchia ra một số các quá trình Apache giống nhau, còn worker tạo ra nhiều thread. Nói chung,prefork tốt hơn trên các hệ thống với một hoặc hai bộ vi xử lý, nơi các hệ điều hành hỗ trợ tốt hơn cho việc cắt nhỏ thời gian giữa các quá trình. Trên hệ thống có số lượng CPU cao hơn, mô hình thread chắc chắn sẽ hiệu quả hơn.

Trong gần như tất cả các trường hợp, chỉ thị MaxClients là hiệu quả nhất cho việc tăng hiệu suất máy chủ, vì nó kiểm soát số lượng tối đa các kết nối đồng thời mà máy chủ Apache có thể quản lý.

Tối ưu hóa các thành phần tĩnh

Nếu website của bạn sử dụng rất nhiều thành phần tĩnh, hoặc nếu bạn tách các thành phần động và tĩnh trên hai hoặc nhiều máy chủ web thì mục tiêu chính của bạn sẽ là cải thiện thời gian đáp trả mà Apache gửi trả lại các thông tin đã được yêu cầu. Cách đơn giản nhất để thực hiện điều này là sử dụng modul mod_cache. Bạn có thể sử dụng modul này với mod_disk_cache vàmod_mem_cache để cung cấp cache bộ nhớ và đĩa của các file tĩnh.

Kiểm tra tài liệu Apache trên modul mod_cache để có thêm thông tin chi tiết hơn.

Tối ưu hóa các thành phần động

Các thành phần động chắc chắn sẽ là thành phần tiêu tốn thời gian nhất cho bất cứ máy chủ web nào. Chúng, đặc biệt nếu bạn sử dụng CGI, sẽ làm tăng thêm thời gian đáp trả để load và thực thi một ứng dụng đơn giản. Có nhiều thông tin bổ sung để các bạn có thể tham khảo tại mod_perl,PHP, và Python và Java.

Ưu điểm chính của các giải pháp dựa trên kịch bản là chúng được nhúng một bộ thông dịch vào Apache, giúp remove vấn đề loading ban đầu cho các kịch bản động. Một số thậm chí còn lưu kịch bản đã được phân tích để dễ dàng được thực thi nếu có yêu cầu sau này.

Toi uu apache

Cấu hình có thể phức tạp và việc có được hệ thống chính xác có thể tốn nhiều thời gian. Một số giải pháp cũng không làm việc tốt chẳng hạn như giải pháp mong đợi với các host ảo, bạn sẽ cần phải thay đổi các kịch bản nào đó để lợi dụng các cải tiến về tốc độ mà nó cung cấp.

Mặc dù vậy những cải tiến ở đây rất đáng kể, có thể giảm được 70% thời gian thực thi đối với một kịch bản Perl bằng cách sử dụng mod_perl thay cho CGI. Thậm chí khi có nhiều công việc hơn, các giải pháp này cũng cho phép bạn giữ được các kết nối vững chắc với cơ sở dữ liệu hoặc có thể lưu trữ các thông tin giữa các yêu cầu. Đây là một điều tuyệt vời cho các site thương mại điện tử và cũng góp phần giảm overhead trong việc load các thông tin giữa các yêu cầu.

Kết luận

Dù Apache là một ứng dụng có thể cấu hình và khá phức tạp nhưng thực sự thú vị vì các cài đặt chuẩn của nó đạt được mức hiệu suất rất cao. Một lĩnh vực mà ở đó bạn có thể dễ dàng cải thiện đáng kể hiệu suất bằng cách điều chỉnh các tham số. Tuy nhiên không may thay, những tham số mà bạn có ít kiểm soát bên trong Apache –ví dụ như các thành phần động và các kịch bản CGI – lại là các tham số có ảnh hưởng lớn nhất về mặt hiệu suất. Kiểm ta một máy chủ Apache điển hình, bạn sẽ thấy rằng thời gian cho ứng dụng Apache để trả lời một kết nối và gửi dữ liệu trở lại chỉ vài ms – tuy nhiên việc đợi cho nguồn dữ liệu đó có thể mất đến vài giây.

Tuy nhiên điều này không phải là việc chúng tôi nhấn mạnh hành động tối ưu là vô nghĩa. Trong suốt quá trình làm việc một hàng thì số lượng ms sẽ ngày một tăng lên. Quan trọng hơn nữa là bạn có thể làm sạch và đơn giản hóa cấu hình Apache của mình từ đó giúp nó giảm được các overhead quản trị hơn trong quá trình thực hiện.

[Tối ưu] Tăng tốc truy cập và tải xuống với mô đun mod_deflate của Apache 2.0

Bạn có thể tăng tốc độ truy cập và tải xuống với mô đun mod_deflate của Apache. Mô đun này cung cấp khả năng lọc các loại tập tin từ máy chủ của bạn và nén trước khi gửi tới trình duyệt của người dùng. Qua đó giảm thời gian mà người dùng truy cập, tải xuống các nội dung trên website của bạn.

Tôi có thể tăng tốc độ tải xuống từ máy chủ Apache 2.0 của tôi như thế nào?

Lưu ý:Chắc chắn rằng mô đun mod_deflate được cài đặt cùng với Apache của bạn.

Mở tập tin httpd.conf bằng cách sử dụng chương trình soạn thảo vi:

# vi httpd.conf

Thêm dòng sau:

LoadModule deflate_module modules/mod_deflate.so

Thêm dòng sau vào giữa 2 thẻ <Location> mở và đóng:

<Location />
AddOutputFilterByType DEFLATE text/html text/plain text/xml
....
...
<Location>

Dòng trên chỉ nén các tập tin html và xml. Đây là các cấu hình tiêu biểu mà bạn có thể tham khảo:

<Location />
...
...
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/atom_xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/x-httpd-php
AddOutputFilterByType DEFLATE application/x-httpd-fastphp
AddOutputFilterByType DEFLATE application/x-httpd-eruby
AddOutputFilterByType DEFLATE text/html
...
...
<Location>

Đóng và lưu tập tin. Tiếp theo bạn khởi động lại dịch vụ Apache trên máy chủ của bạn:

# /etc/init.d/httpd restart

Bạn có thể chọn thư mục mà bạn muốn sử dụng tính năng nén. Ví dụ như thư mục /static/help/ directory:

<Directory "/static/help">
AddOutputFilterByType DEFLATE text/html
</Directory>

Trong thực tế, các tập tin ảnh và các tập tin mp3 thường không cần nén. Nếu bạn không muốn nén ảnh và tập tin mp3 thì bạn có thể dùng các dòng cấu hình sau:

SetOutputFilter DEFLATE
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.pdf$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.avi$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.mov$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.mp3$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.mp4$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.rm$ no-gzip dont-vary

Lưu ý rằng quá trình này sẽ làm tăng xử lý của CPU và bộ nhớ trên máy chủ và trình duyệt của máy trạm. Do đó bạn cần cân nhắc loại tập tin nào mà bạn cần nén.

[Linux]Phát hiện xâm nhập cho ứng dụng PHP với PHPIDS

alt
Bài viết này hướng dẫn cách cài đặt PHPIDS trên hệ thống máy chủ web với apache2 và PHP5. PHPIDS(PHP-Intrusion Detection System) sử dụng rất đơn giản, cấu trúc chặt chẽ, nhanh và là lớp bảo mật cho ứng dụng web trên nền PHP. Đã được kiểm tra trên hệ thống Debian Etch LAMP với apache2 và PHP5 với địa chỉ IP 192.168.0.100. Apache user và group trên Debian Etch là www-data, nên nếu bạn có một distro khác, Apache user và group có thể khác. Vị trí của tập tin php.ini (/etc/php5/apache2/php.ini trên Debian Etch) cũng có thể khác.

Sử dụng virtual host với document root /var/www/web1/web trong ví dụ.

Cài đặt PHPIDS

Vì lí do bảo mật tôi muốn cài đặt PHPIDS bên ngoài document root, do đó tôi tạo thư mục /var/www/web1/phpids:

$ mkdir /var/www/web1/phpids

Sau đó cài PHPIDS như sau (tại thời điểm viết bài này phiên bản mới nhất là 0.4.7) – của tất cả nội dung của phpids-0.4.7.tar.gz file, chúng ta chỉ cần thư mục lib/ :

$ cd /tmp
$ wget http://php-ids.org/files/phpids-0.4.7.tar.gz
$ tar xvfz phpids-0.4.7.tar.gz
$ cd phpids-0.4.7
$ mv lib/ /var/www/web1/phpids/

Bây giờ ta chuyển tới thư mục /var/www/web1/phpids/lib/IDS…

$ cd /var/www/web1/phpids/lib/IDS

… và tạo thư mục tmp/ (nơi lưu tập tin log của PHPIDS) có quyền ghi với Apache user và group:

$ chown -R www-data:www-data tmp/

Tiếp đó cấu hình cho PHPIDS (Config.ini):

$cd Config/
$ vi Config.ini

Sử dụng cấu hình mặc định, tất cả những gì tôi làm là điều chỉnh đường dẫn:

; PHPIDS Config.ini

; General configuration settings

; !!!DO NOT PLACE THIS FILE INSIDE THE WEB-ROOT IF DATABASE CONNECTION DATA WAS ADDED!!!

[General]

filter_type = xml
filter_path = /var/www/web1/phpids/lib/IDS/default_filter.xml
tmp_path = /var/www/web1/phpids/lib/IDS/tmp
scan_keys = false

exceptions[] = __utmz
exceptions[] = __utmc

; If you use the PHPIDS logger you can define specific configuration here

[Logging]

; file logging
path = /var/www/web1/phpids/lib/IDS/tmp/phpids_log.txt

; email logging

; note that enabling safemode you can prevent spam attempts,
; see documentation
recipients[] = test@test.com.invalid
subject = “PHPIDS detected an intrusion attempt!”
header = “From: info@php-ids.org”
safemode = true
allowed_rate = 15

; database logging

wrapper = “mysql:host=localhost;port=3306;dbname=phpids”
user = phpids_user
password = 123456
table = intrusions

; If you would like to use other methods than file caching you can configure them here

[Caching]

; caching: session|file|database|memcached|none
caching = file
expiration_time = 600

; file cache
path = /var/www/web1/phpids/lib/IDS/tmp/default_filter.cache

; database cache
wrapper = “mysql:host=localhost;port=3306;dbname=phpids”
user = phpids_user
password = 123456
table = cache

; memcached
;host = localhost
;port = 11211
;key_prefix = PHPIDS
;tmp_path = /var/www/web1/phpids/lib/IDS/tmp/memcache.timestamp

Sử dụng PHPIDS

Bây giờ chúng ta sẽ tạo tập tin /var/www/web1/web/phpids.php mà sẽ gọi PHPIDS cho ta (ta sẽ đặt tập tin này cho tất cả các tập tin PHP để PHPIDS được sử dụng tự động):

$ vi /var/www/web1/web/phpids.php

set_include_path(
get_include_path()
. PATH_SEPARATOR
. ‘/var/www/web1/phpids/lib’
);

require_once ‘IDS/Init.php’;
$request = array(
‘REQUEST’ => $_REQUEST,
‘GET’ => $_GET,
‘POST’ => $_POST,
‘COOKIE’ => $_COOKIE
);
$init = IDS_Init::init(‘/var/www/web1/phpids/lib/IDS/Config/Config.ini’);
$ids = new IDS_Monitor($request, $init);
$result = $ids->run();

if (!$result->isEmpty()) {
// Take a look at the result object
echo $result;
require_once ‘IDS/Log/File.php’;
require_once ‘IDS/Log/Composite.php’;

$compositeLog = new IDS_Log_Composite();
$compositeLog->addLogger(IDS_Log_File::getInstance($init));
$compositeLog->execute($result);
}
?>

Bây giờ khi bạn truy cập tới tập tin này từ trình duyệt (ví dụ: http://192.168.0.100/phpids.php), bạn sẽ thấy một trang trắng. Nhưng nếu bạn sử dụng một vài tham số nguy hiểm trên URL (ví dụ: http://192.168.0.100/phpids.php?test=%22%3EXXX%3Cscript%3Ealert(1)%3C/script%3E), PHPIDS sẽ phát hiện nó và in ra kết quả trên trình duyệt:

alt

Bây giờ ta cần tìm cách làm cho mã PHP sử dụng PHPIDS. Tất nhiên bạn không muốn sửa tất cả các mã PHP. May mắn là có cách tốt hơn: chúng ta có thể nói cho PHP để gọi một mã PHP mỗi khi được gọi. Ví dụ: nếu ta gọi info.php trên trình duyệt, PHP sẽ thực thi phpids.php trước và sau đó mới đến info.php, và ta thậm chí không phải chỉnh sửa info.php.

Ta có thể làm việc đó bằng cách sử dụng tham số auto_prepend của PHP. Chúng ta cũng thể đặt nó trong php.ini (thiết lập toàn cục này sẽ được dùng cho tất cả các website sử dụng PHP trên server), hoặc ở tập tin .htaccess (thiết lập này sẽ chỉ dùng cho website nơi đặt tập tin .htaccess đó):

php.ini
Mở tập tin php.ini (ví dụ : /etc/php5/apache2/php.ini), và đặt auto_prepend_file thành /var/www/web1/web/phpids.php:

$ vi /etc/php5/apache2/php.ini

[…]
auto_prepend_file = /var/www/web1/web/phpids.php
[…]

Sau đó khởi động lại Apache:

$ /etc/init.d/apache2 restart

.htaccess
Thay vì chỉnh sửa php.ini (mà thay đổi toàn cục, ví dụ : thay đổi cho tất cả website sử dụng PHP trên server), bạn có thể sử dụng tập tin .htaccess (vì thế thiết lập chỉ áp dụng cho chính website có chứa tập tin .htaccess đó):

$ vi /var/www/web1/web/.htaccess

php_value auto_prepend_file /var/www/web1/web/phpids.php

Hãy chắc chắn rằng vhost cho website ở /var/www/web1/web có chứa thứ gì đó dạng như sau(nếu không dòng php_value trong tập tin .htaccess sẽ bị bỏ qua) (nếu bạn phải thay đổi vhost, đừng quên khởi động lại Apache):

AllowOverride All

Bây giờ tạo một tập tin PHP đơn giản /var/www/web1/web/info.php:

$ vi /var/www/web1/web/info.php

phpinfo();
?>

Truy cập tới nó bằng trình duyệt (http://192.168.0.100/info.php), và bạn sẽ thấy kết quả của phpinfo().

Bây giờ hãy sử dụng thử vài tham số nguy hiểm trên URL (ví dụ: http://192.168.0.100/info.php?test=%22%3EXXX%3Cscript%3Ealert(1)%3C/script%3E), và bạn sẽ thấy PHPIDS thông báo trước khi phpinfo()

Viết bởi whatvn site:opensource.com.vn

[Linux]Tạo đường dẫn thân thiện với PHP

altMột trong những lý do chính để sử dụng ngôn ngữ kịch bản PHP là do khả năng dễ dàng tạo nội dung động. Thông thường nó sẽ dẫn tới một mã đơn dùng tạo ra nội dung ựa trên các tham số đầu vào ( đó là các giá trị trên URL).
Bài viết này bao gồm các kỹ thuật và phương thức để thay thế cho các tham số trên URL một cách đẹp đẽ và thân thiện,  không khác gì việc làm thế nào để đọc các tham số này.
Nếu bạn không chắc chắn về những điều đã nói ở trên, hãy xem qua ví dụ bên dưới. Một website lưu trữ danh sách các bài viết trong cơ sở dữ liệu gọi là articles. Bây giờ chúng ta sẽ xây dựng website mà mỗi bài viết được liên quan bởi mổi ID như:

http://www.domain.com/article.php?article_id=1234

Tuy nhiên đây không phải là cách tốt nhất để làm việc này. Đầu tiên, nếu người dùng đã đọc một lượng lớn bài viết trên website thì lịch sử lưu trữ của trình duyệt trên máy họ sẽ lưu lại lượng lớn các ID khác nhau. Vì vậy họ không thể quay trở lại bài viết nào đó một cách dễ dàng mà không sử dụng bookmark hoặc trở lại từ trang chủ để tìm kiếm liên kết từ đầu.
Quan trọng hơn đây là dữ liệu quý giá để cách bộ máy tìm kiếm sử dụng để đánh chỉ mục cho trang của bạn. Chúng ta sẽ xây dựng theo cách mỗi bài viết được truy cập bởi một phương thức thân thiện hơn. Ví dụ, một bài viết sau này đây có dạng đường dẫn:

http://www.domain.com/articles/multi-step-wizards

Bài viết này sẽ trình bài cách đọc địa chỉ URL như trên và dẫn nó tới dữ liệu trong cơ sở dữ liệu của bạn. Có nhiều cách để làm được việc này với PHP, chúng ta sẽ xem xét mỗi phương thức và thảo luận về chúng(pros and cons of each.)
Thêm nữa ý tưởng được sử dụng ở đây có thế là “thông qua” mỗi cách (như việc đọc URL một cách thông thường) nhưng chúng ta sẽ bỏ qua nó.

Apache’s Mod Rewrite
Cách đầu tiên chúng ta tìm hiểu là mod_rewrite của Apache. module này làm việc theo cách gán các địa chỉ truy vấn với thiết lập của các luật được chỉ định trước và truyền dữ liệu  cho mã lệnh với định dạng mà bạn thiết lập.
Chúng ta có file news.php ở thư mục gốc của website (mà bạn có thể truy cập trực tiếp theo đường dẫn http://www.domain.com/news.php). Đoạn mã này sẽ trả về dữ liệu của bài viết theo tham số news_id trên URL.
Nếu ta truy cập vào bài viết với ID bằng 63 bạn có thể dùng đường dẫn http://www.example.com/news.php?news_id=63.
Thay vào đó ta muốn tạo cho nó một cách đẹp đẽ hơn, tốt hơn là duyệt qua URL, chúng ta muốn truy cập đến bài viết theo dạng http://www.example.com/news/63.html. Không có lý do đặc biệt nào để được như vậy – đây chỉ là ví dụ.
Dù sao đi nữa chúng ta có thể làm được việc này với mod_rewrite bằng luật đơn giản, hoặc ở cấu hình của máy chủ (httpd.conf) hoặc ở tập tin .htaccess trong thư mục chứa website.
Nội dung như sau:
.htaccess
RewriteEngine on
RewriteRule ^/news/([0-9]+)\.html /news.php?news_id=$1
Sử dụng mẫu biểu thức chính quy trên đây ta sẽ lấy tất cả các truy vấn phù hợp tới website bắt đầu bằng news sau đó là số đi cùng với .html. Các mục được đặt trong dấu ngoặc đơn được lưu với các giá trị như $1 hoặc $2 ( chúng ta chỉ có một dấu ngoặc với $1 được thiết lập ).
Tiếp đó chúng ta sử dụng tham số $1 trên URL. Trong file news.php chúng ta sẽ truy cập tới tham số như với cách ta gọi mã này ở cách thông thường:
news.php
$news_id = $_GET[‘news_id’];
?>

Các tham số URL mở rộng

Đôi khi ta gặp phải tình trạng cần cung cấp một số tham số mở rộng trên URL cho đoạn mã. Quay trở lại với ví dụ ở trên, có lẽ bạn có thể truy cập tới news.php với tham ố mở rộng là ‘print’, dùng để hiển thị in ấn cho bài viết (bạn cần sử dụng css cho nó, nhưng không có vấn đề gì với ví dụ này).
Bạn có thể truy cập bằng cách http://www.example.com/news.php?news_id=63&print=1.
Sử dụng cách tạo đường dẫn thân thiện ta muốn truy cập tới bài viết bằng cáchhttp://www.example.com/news/63.html?print=1, luật bên trên là cách đơn giản để bỏ đi tham số print trên URL. Để truyền nó cho mã lệnh ta cần sử dụng giá trị của Apache %{QUERY_STRING} trong biểu thức của mod_rewrite. Ta chỉ việc gắn vào news_id dấu &.
.htaccess
RewriteEngine on
RewriteRule ^/news/([0-9]+)\.html /news.php?news_id=$1&%{QUERY_STRING}
Bây giờ ta có thể truy cập tới tham số thông qua phương thức $_GET
news.php
$news_id = $_GET[‘news_id’];
$printVersion = isset($_GET[‘print’]);
?>
Tất cả đều sử dụng mod_rewrite. Đây là một module hiệu quả và khá phức tạp, và bạn có thể dễ dàng gặp rắc rối khi sử dụng nó. Đôi khi nó có thể rất khó khăn để lấy biểu thức của bạn một cách chính xác, hoặc bạn tạo ra quy tắc không đúng vv… Có một số cấu hình gỡ lỗi bạn có thể sử dụng để khắc phục vấn đề bạn có thể gặp phải.

Sử dụng Apache Forcetype Directive

Thay thế cho mod_rewrite là sử dụng ForceType directive. Nó cho phép mã lệnh PHP hoạt động mà không cần có phần mở rộng .php. Thông thường máy chủ được cấu hình tập tin PHP phải kết thúc bằng .php, vì vậy các mã khác không phải php(như .html) không được thực thi bằng PHP engine.
Quay trở lại ví dụ sử dụng mod_rewrite, thay vì có một đoạn mã là news.php ở thư mục gốc, đoạn mã của chúng ta có thể được gọi là news. Vì vậy nó có thể được truy cập theo dạng http://www.example.com/news.
Sử dụng thiết lập sau trong httpd.conf hoặc .htaccess sẽ thực thi news như là một tập tin PHP.
.htaccess

ForceType application/x-httpd-php

Bây giờ khi chúng ta truy cập bài viết theo dạng http://www.example.com/news/63.html, đoạn mã news sẽ được truy cập trực tiếp và ta phải phân tích phần /63.html. Nó được lưu với giá trị máy chủ PATH_INFO.
news
echo $_SERVER[‘PATH_INFO’];
// outputs ‘/63.html’
?>

Ta có mẫu biểu thức chính quy để xác định ố 63 trong chuỗi. Cũng có kỹ thuật khác để bạn sẽ tìm ra dữ liệu một cách chính xác, như là sử dụng hàm explode(). Ví dụ, nếu bạn bung chuỗi này ở / tiếp đó tất cả các phần của đường dẫn sẽ được lưu trong mảng (chỉ có một phần ở ví dụ này cho nên nó sẽ không hoạt động). Quay trở lại mẫu biểu thức chính quy.
Đây là một mẫu biểu thức chính quy (phù hợp với preg_match()), sẽ tìm chuỗi có dấu / bắt đầu sau đó là số cùng với .html. Nó sẽ lưu toàn bộ những gì phù hợp vào mảng từ đó trích ra ID của bài viết.
news
$path = $_SERVER[‘PATH_INFO’];
preg_match(‘!^/(\d+)\.html$!’, $path, $matches);

// $matches[0] will store the entire matched string, while $matches[1]
// stores the string matched in the first set of brackets. We want it
// to be an int, so we simply cast it.
$news_id = (int) $matches[1];
?>

Bây giờ ta có thể sử dụng $news_id trong đoạn mã. Chắc chắn nếu đường dẫn không đúng với định dạng thì $news_id có thể là 0 sau khi ta đặt nó là dạng int, để an oàn hơn cho cơ sở dữ liệu thậm chí cả khi bài viết không tồn tại.

Sử dụng điều hướng trang thông báo lỗi 404
Đây chỉ là một cách để có được kết quả, dù sao nó cũng là cách đơn giản nhất để khai triển và cũng tốt hơn.
Bằng cách chỉnh chỉnh sửa cấu hình thông báo lỗi 404 bạn có một phương cách điều khiển riêng mà sẽ quyết định cách đối xử với các truy vấn. Dĩ nhiên đây chỉ là truy vấn tới tập tin không tồn tại. Ví dụ, nếu bạn có hình ảnh trên website bạn vẫn có thể truy cập tới chúng nếu tồn tại. Vì vậy việc quyết địng đối xử 404 không được sử dụng.
Thêm nữa, bằng cách sử dụng hàm header() bạn có thể trả về header 200 OK hoặc 404 File Not Found, ở phía người dùng cuối họ không quan tâm rằng trang này thực sự không tìm thấy.

Ví dụ:
Nếu bạn truy cập theo đường dẫn : http://www.domain.com/d/articles/php/index.html. Trang này sẽ sử dụng ‘ForceType’ với mã lênh PHP gọi là ‘d’ để xử lý truy vấn, nhưng chúng ta không sử dụng phương pháp này.
Giả sử ta muốn URL có dạng : http://www.domain.com/articles/php/index.html. Thay vì tạo đường dẫn này cho mỗi bài viết, chúng ta có thể sử dụng việc xử lý 404 để duyệt qua đường dẫn bài viết như chúng ta đang làm với tập tin d.

Thực hiện xử lý 404
Chúng ta không thực hiện xử lý các ví dụ ở trên thay vào đó chúng ta sẽ thực hiện xử lý cách bài viết ví dụ. Ta cũng sẽ thêm vào mục đích để xử lý các truy vấn khác (ngoài news) và cả các trang lỗi..
Điều đầu tiên là ta tạo xử lý 404. Việc này có thể làm tại tập tin .htaccess hay httpd.conf.
.htaccess
ErrorDocument 404 /handler.php

Điều này có nghĩa rằng tất cả các truy vấn tới tập tin không tồn tại sẽ được trả về tập tin handler.php trên thư mục gốc của website.
Trong đoạn mã này ta cần phân tích truy vấn. Bạn có thể tìm thấy truy vấn gốc bằng giá trị REDIRECT_URL .
handler.php
$request = $_SERVER[‘REDIRECT_URL’];

// explode on / to find all the different request parts
$parts = explode(‘/’, $request);

// flag to determine whether or not we’ve found content
$found = false;

// the first element will be empty to we get rid of it
array_shift($parts);

// now we determine the type of content
switch ($parts[0]) {
case ‘news’:
// use a very similar regex to our previous example
preg_match(‘!^(\d+)\.html$!’, $parts[1], $matches);
$news_id = (int) $matches[1];

$output = getNewsArticle($news_id);
// this function doesn’t really exist, but if it
// did it would return the news content if article
// found, or return null if not

if ($output !== null)
$found = true;
break;

case ‘articles’:
// here we would implement a handler to display a document,
// say if they accessed http://www.example.com/documents/1234.html
break;
default:
}

if ($found) {
// output a header to say the content exists, other a 404 will be sent
header(‘HTTP/1.1: 200 OK’);
echo $output;
}
else {
// no content was found. this should be automatically sent by the
// server anyway, but we’ll specify anyway just in case
header(‘HTTP/1.0 404 Not Found’);
echo ‘File not found’;
}
?>
Rõ ràng đoạn mã này còn thô sơ nhưng hy vọng thông qua đoạn mã này bạn sẽ tìm ra cách tốt hơn.

Sử dụng mod_rewrite như là 404 Handler

Trong khi chỉnh sửa cấu hình xử lý 404 là cách linh động để tạo đường dẫn thân thiện, thì lỗi lớn nhất của nó là khi dữ liệu được cung cấp phương thức POST, không phù hợp (theo cách Apache hướng dữ liệu truy vấn khi sử dụng ErrorDocument).
Ta có thể sử dụng kết hợp giữa mod_rewrite và cấu hình xử lý 404. Các mà kỹ thuật này hoạt động là sử dụng mod_rewrite hướng tất cả truy vấn tới đoạn mã xác định khi mã truy vấn tới một tập tin là không tồn tại. Sử dụng đoạn mã sau (trong tập tin .htaccess hoặc httpd.conf).

Using mod_rewrite to foward requests that don’t correspond to an existing file or directory (.htaccess)
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1

Đầu tiên RewriteCond kiểm tra xem truy vấn tới tập tin có tồn tại hay không. Ở mod_rewrite -f quy định là tập tin, khi không phải là toán tử. !-f có nghĩa “nếu truy vấn tới tập tin không tồn tại”.
Nếu rewrite_cond thành công succeeds (truy vấn tới tập tin không tìm thấy), tiếp đó Apache chuyển tới điều kiện tiếp theo. Chỉ thị !-d có nghĩa điều kiện thành công nếu truy vấn không phù hợp với thư mục tồn tại trên máy chủ
Cuối cùng nếu cả 2 điều kiện thành công truy vấn được chuyển tới tập tin index.php, được chỉ định ởRewriteRule.
Bạn có thể sử dụng kỹ thuật này ở phần trước (ở Sử dụng điều hướng trang thông báo lỗi 404) để đọc URL . Sử dụng kỹ thuật  được phác qua ở đây bạn có thể truy cập tới dữ liệu POST .

Viết bởi whatvn site:opensource.com.vn