Rewrite trong OpenLiteSpeed và chuyển đổi từ .htaccess

Thời gian qua mình đã thực hiện một số cập nhật về hiệu năng cho server và bắt đầu sử dụng CDN để đối phó với hiện tượng đứt của các tuyến cáp quốc tế AAG và SMW-3. Đến thời điểm này, trang web đã phục vụ nội dung được nhanh chóng hơn do tất cả hình ảnh đều được phục vụ bởi CDN. Mình sẽ có các bài trải nghiệm chi tiết sau. Còn bây giờ, mình sẽ tiếp nối series về OpenLiteSpeed, với vấn đề thay đổi thói quen sử dụng file .htaccess (một file thiết lập rất quen thuộc của Apache), sang việc điều chỉnh một cách trực tiếp các thiết lập trong virtual host, điển hình là các lệnh rewrite và một số thiết lập hay dùng khác.

Khi đọc bài này, các bạn hãy chắc chắn rằng đã thiết lập xong listener và virtual host theo hướng dẫn mình đã viết rồi nhé. Bài này sẽ chỉ ra một số các thiết lập tại virtual host tương ứng với các dòng lệnh thiết lập hay dùng trong .htaccess:

  1. Sử dụng symlink
  2. Chỉ mục (index)
  3. Trang báo lỗi tuỳ chọn
  4. Expires (cache tại trình duyệt)
  5. Cho phép và chặn địa chỉ IP
  6. Rewrite
  7. Context (điều chỉnh ở cấp thư mục)

Ngoài ra còn có điều chỉnh về realm rất hay, được dùng để khoá một số thư mục nhất định, người dùng phải nhập username và mật khẩu mới truy cập được. Mình có viết một bài riêng về nó, cùng với các thiết lập về SSL.

Bây giờ chúng ta hãy đi vào nội dung chính của bài. Các bạn cần thay đổi các thiết lập trên trong phần thiết lập virtual host của trang admin của OpenLiteSpeed.

Sử dụng symlink

Symlink (symbolic link) trong các hệ điều hành Linux giống như shortcut trong Windows vậy. Một số mã nguồn cần làm việc với symlink để thống nhất các đường dẫn đến một số file hay dùng mà không cần phải thay đổi chúng trong các file thiết lập. Trong file .htaccess, người ta chỉ dùng một dòng đơn giản để kích hoạt symlink:

Options +FollowSymLinks

Nhưng đối với OpenLiteSpeed, các bạn sẽ mở tab Basic ứng với virtual host các bạn chọn, rồi nhìn vào dòng Follow Symbolic Link.

Điều chỉnh symlink trong virtual host của OpenLiteSpeed

Để sửa dòng này, các bạn ấn vào nút Edit ở bên phải bảng Security. Với dòng này các bạn chỉ cần quan tâm đến hai giá trị Yes (có) và No (không) thôi.

Thiết lập chỉ mục (index)

Khi trình duyệt phía người dùng yêu cầu nội dung từ một link không dẫn đến một file cụ thể nào, server sẽ trả về chỉ mục nằm ở thư mục tương ứng. Chỉ mục này có thể là danh sách file và thư mục con bên trong, hoặc là nội dung của file chỉ mục có sẵn. Thiết lập chỉ mục này nằm trong bảng Index Files của tab General.

Tab General của phần thiết lập virtual host

Trong bảng này có các dòng sau:

  • Use Server Index Files: Sử dụng lại thiết lập chỉ mục đã có ở cấp server (mục Server Configuration trong menu bên trái trang admin) hay không? Các câu trả lời được chấp nhận là:
    • Yes: Có, nhưng bỏ qua các thiết lập ở các dòng dưới (nếu có điều chỉnh).
    • No: Không. Hãy điền vào các dòng dưới nếu cần sử dụng chỉ mục cho riêng virtual host được điều chỉnh.
    • Addition: Có, và bổ sung thêm các thiết lập ở các dòng dưới.
  • Index Files: Tên các file chỉ mục. Sử dụng dấu phẩy (,) để phân cách giữa hai tên. Tương ứng ở file .htaccess là dòng lệnh DirectoryIndex.
  • Auto Index: Sử dụng chỉ mục tự động (thường là hiển thị danh sách file và thư mục bên trong). Bình thường đối với dòng này, nên chọn No (không) để luôn giấu danh sách file và thư mục bên trong. Chỉ nên chọn Yes (có) trong một số ít hoàn cảnh nhất định, ví dụ như server riêng cho mọi người vào tải toàn bộ file trong đó chẳng hạn. Ngoài ra còn có một tuỳ chọn Not Set (không thiết lập) để virtual host sử dụng lại thiết lập này từ cấp server. Tương ứng ở file .htaccess, có dòng lệnh sau để kích hoạt chỉ mục tự động:
    Options +Indexes
  • Auto Index URI: Đường dẫn đến file chỉ mục mẫu dùng để sinh chỉ mục tự động, được sử dụng để thay đổi hình thức trang chỉ mục. Sử dụng đường dẫn tuyệt đối tại dòng này.

Lưu ý nhỏ rằng, bảng Index Files trên cũng có ở tab General thuộc mục Server Configuration. Nhưng ở đó không có dòng Use Server Index Files nhé.

Trang thông báo lỗi tuỳ chọn

Ở file .htaccess, người ta sử dụng dòng lệnh ErrorDocument để thiết lập trang thông báo lỗi riêng. Đối với OpenLiteSpeed, việc này được thực hiện ở bảng Customized Error Pages trong tab General.

Đây là một bảng liệt kê các đường dẫn tuỳ chọn cho các mã lỗi HTTP (chẳng hạn như mã lỗi 404 – không tìm thấy). Bảng này gồm có hai cột chính, ứng với các giá trị cần quan tâm:

  • Error Code: Mã lỗi.
  • URL: Đường dẫn tuyệt đối hoặc link dẫn đến thông báo lỗi tương ứng.

Ở bên phải tiêu đề bảng này có một nút Add để bổ sung trang báo lỗi. Ở cuối dòng ứng với một trang lỗi có hai nút sửa và xoá.

Expires (cache tại trình duyệt)

Để tăng tốc tải trang trong những lần tiếp theo người dùng truy cập website, trình duyệt phía người dùng thực hiện lưu tạm thời (cache) các file đã tải (và được hiển thị nội dung) từ trước, trong một khoảng thời gian nhất định. Server có thể điều chỉnh hành vi này của trình duyệt đối với từng loại file.

Ở file .htaccess, người ta thiết lập bằng các lệnh thuộc module mod_expires của Apache: ExpiresActive, ExpiresDefault, ExpiresByType. Còn đối với OpenLiteSpeed, tất cả nằm trong bảng Expires Settings thuộc tab General.

  • Ứng với lệnh ExpiresActive là dòng Enable Expires. Nên chọn Yes (có) để cho phép trình duyệt phía người dùng lưu tạm file.
  • Dòng Expires Default: Chỉ định khoảng thời gian mặc định.
  • Dòng Expires By Type: Chỉ định khoảng thời gian đối với từng loại file.

OpenLiteSpeed sử dụng cú pháp như sau dành cho khoảng thời gian:

  • Đầu tiên, viết một trong hai chữ cái in hoa sau để xác định thời điểm bắt đầu lưu tạm file.
    • A (access time): Thời điểm trình duyệt truy cập file. Tuỳ chọn này hay được dùng.
    • M (modified time): Thời điểm file được sửa lần cuối. Tuỳ chọn này được dùng cho những nội dung có hiệu lực ngắn hạn.
  • Tiếp tục viết liền vào sau đó một con số tính bằng giây, chỉ khoảng thời gian mà file được cache tính từ thời điểm được chọn ở trên.

Ví dụ: A2592000, có nghĩa là trình duyệt sẽ thực hiện cache file trong 2592000 giây (tức 30 ngày) kể từ khi trình duyệt gọi đến file đó.

Đối với dòng Expires By Type, các bạn điền với cú pháp sau:

<MIME type>=<khoảng thời gian>

Trong đó các bạn thay cả <MIME type> bằng một MIME type tương ứng với một loại file cụ thể. Các bạn có thể tham khảo thêm một trang của Mozilla để biết MIME type của một số file phổ biến. Để áp dụng cho nhiều loại file khác nhau, thì cứ hết một thiết lập cho MIME type này, các bạn gõ dấu phẩy (,), rồi điền tiếp thiết lập cho MIME type khác. Và để đơn giản hoá việc áp dụng cho nhiều loại file, OpenLiteSpeed cho phép sử dụng dấu sao (*) trong MIME type, chẳng hạn như image/* để chỉ toàn bộ các loại file ảnh. Ví dụ ở Noisy Stream mà mình đang áp dụng:

application/*=A2592000, image/*=A31536000, video/*=A31536000, audio/*=A31536000, text/css=A2592000, text/javascript=A2592000, application/vnd.ms-fontobject=A31536000, font/*=A31536000

Cho phép và chặn địa chỉ IP

Việc này được thực hiện rất thường xuyên trong file .htaccess. Các dịch vụ hosting cũng thực hiện chặn IP thông qua việc chỉnh sửa file đó. OpenLiteSpeed dành riêng một bảng Access Control trong tab Security dành cho việc cho phép và chặn IP.

Bảng Access Control thuộc tab Security trong phần cài đặt virtual host của OpenLiteSpeed

Bảng này gồm hai danh sách sau:

  • Allowed List (danh sách cho phép): Những địa chỉ IP thuộc danh sách này được phép truy cập vào trang tại virtual host được điều chỉnh. Sử dụng thêm chữ cái T mà ghi liền sau một địa chỉ IP cụ thể để chỉ ra địa chỉ đó là đáng tin cậy, khi đó nó sẽ không bao giờ bị OpenLiteSpeed áp dụng các biện pháp lọc hoặc hạn chế lưu lượng.
  • Denied List (danh sách chặn): Những địa chỉ IP tại đây sẽ hoàn toàn bị chặn.

Khi chỉnh sửa bất cứ danh sách nào trong bảng này, các bạn viết mỗi một địa chỉ IP ra một dòng riêng. Các bạn có thể điền bất cứ một địa chỉ IPv4 hoặc IPv6 nào. Ví dụ:

192.168.1.24
3ffe:302:11:2:20f:1fff:fe29:717c

Riêng IPv6 có thể được viết trong cặp ngoặc vuông [].

Thậm chí các bạn có thể điền cả một mạng con (sub-network) bắt đầu bằng một địa chỉ IP nhất định. Một số ví dụ được OpenLiteSpeed chấp nhận:

  • Địa chỉ IPv4 viết cùng subnet mask:
    192.168.1.0/255.255.255.0
    192.168.1.0/24
    192.168.1.*

    Hai cách viết thứ hai và thứ ba có lẽ đã rất quen thuộc với những ai từng sử dụng dịch vụ hosting chia sẻ hoặc server Apache.

  • Địa chỉ IPv6 viết cùng subnet mask:
    3ffe:302:11:2:20f:1fff:fe29:717c/64
    [3ffe:302:11:2:20f:1fff:fe29:717c]/64

Rewrite

Tab Rewrite chính là nơi các bạn sử dụng các lệnh RewriteCondRewriteRule vốn được sử dụng trong file .htaccess.

Tab Rewrite trong phần cài đặt virtual host của OpenLiteSpeed

Để có thể áp dụng các lệnh đó, trước hết chúng ta cần chỉnh lại dòng Enable Rewrite trong bảng Rewrite Control sang giá trị Yes (có). Sau đó các bạn sẽ điền các lệnh RewriteCondRewriteRule vào ô Rewrite Rules.

Lưu ý là tại ô Rewrite Rules, chỉ có hai lệnh trên được chấp nhận xử lý. OpenLiteSpeed không chấp nhận bất cứ cú pháp nào khác không liên quan, kể cả các dòng đóng mở khối (<Files>, <IfModule>, v.v…). Các lệnh được điền tại đây sẽ được áp dụng cho toàn bộ nội dung thuộc virtual host được điều chỉnh. Nếu muốn sử dụng các lệnh thiết lập khác, hoặc áp dụng cho một thư mục con cụ thể (cùng với file và thư mục con bên trong), thì tab Context được nhắc đến sau đây sẽ dành cho các bạn.

Context

Tab Context (phạm vi) trong phần cài đặt virtual host chính là nơi các bạn thực hiện các điều chỉnh cho từng vùng cụ thể (thư mục hoặc nhóm file). Tab này có duy nhất một bảng liệt kê các context, các bạn chú ý các nút như trong hình dưới.

Khi ấn nút bổ sung một context, các bạn sẽ được đưa đến bảng New Context để chọn loại context.

Bảng chọn loại context của OpenLiteSpeed

Tại đây các bạn cần quan tâm đến các loại context sau:

  • Static: Đây là loại có thể áp dụng cho hầu hết trường hợp sử dụng thông thường, trừ các trường hợp được đề cập ở các loại context còn lại. Công dụng chính của loại này tương tự như tab Rewrite, nhưng đường dẫn đích của quá trình rewrite trong loại context này có thể thuộc về document root (thư mục gốc của nội dung virtual host) hoặc không.
  • Redirect: Chuyển hướng sang link khác.

Sau khi chọn được loại context phù hợp, các bạn ấn nút Next ở bên phải tiêu đề bảng, để chuyển sang bảng thiết lập chi tiết cho loại context tương ứng. Khi các bạn tiến hành sửa một context, bảng này cũng sẽ xuất hiện.

Bảng thiết lập chi tiết context của OpenLiteSpeed

Tại đây, chú ý điền hoặc điều chỉnh đủ các dòng có đánh dấu sao (*). Có một số dòng thiết lập mà các bạn cần quan tâm:

  • URI: Đây là đường dẫn tương đối so với document root mà các bạn muốn xử lý, bắt đầu bằng dấu gạch chéo (/). Hoặc các bạn có thể viết regex (regular expression) khớp với một số đường dẫn, bắt đầu bằng exp:, rồi tới regex của các bạn.
    Nếu URI chỉ đến một thư mục thật trong server, hãy bổ sung một dấu gạch chéo (/) nữa vào cuối URI. Nếu không phải thì tuỳ các bạn muốn áp dụng cho file và thư mục thuộc URI hay không mà thêm hoặc không thêm dấu đó vào cuối URI.
  • Location (vị trí): Tại đây các bạn điền đường dẫn tuyệt đối dẫn đến file hoặc thư mục thật trên server. Các biến đặc biệt sau của OpenLiteSpeed được phép sử dụng trong đường dẫn để làm gọn đường dẫn:
    • $DOC_ROOT: Document root
    • $VH_ROOT: Virtual host root (gốc riêng của virtual host)
    • $SERVER_ROOT: Nơi đã cài đặt OpenLiteSpeed

    Cách sử dụng các biến này, các bạn có thể xem thêm tại phần chuẩn bị cài đặt virtual host.

  • Accessible (có thể truy cập): Chọn một trong hai giá trị Yes (có) hoặc No (không).
  • Enable Expires, Expires Default, Expires By Type: Giống như ở bảng Expires Settings thuộc tab General, được chỉ dẫn ở phần Expires của bài này.
  • Index Files, Auto Index: Giống như ở bảng Index Files thuộc tab General, được chỉ dẫn cụ thể ở phần Index của bài này.
  • Extra Headers: Bổ sung các HTTP header trong phản hồi của server. Các header này có thể thấy được qua công cụ CURL hoặc cửa sổ Developer Tools của trình duyệt. Ở ô Extra Headers, các bạn viết mỗi header ra một dòng riêng. Ví dụ:
    Strict-Transport-Security: max-age=31536000; includeSubDomains
    Access-Control-Allow-Origin: *

    Ô vừa rồi tương ứng với các lệnh Header trong file .htaccess.

  • Access Allowed, Access Denied: Ý nghĩa và cách viết lần lượt tương tự Allowed ListDenied List trong bảng Access Control thuộc tab Security, được hướng dẫn tại phần cho phép và chặn IP của bài này. Tuy nhiên ở hai ô này, các bạn không điền từng IP một ra dòng riêng, mà viết các IP liên tiếp nhau và phân cách nhau bằng dấu phẩy (,). Và trong khi ô Allowed List thuộc bảng Access Control kia có sử dụng riêng chữ cái T để biểu thị địa chỉ IP đáng tin, thì ô Access Allowed ở đây không sử dụng.
  • Enable Rewrite, Rewrite Rules: Tương tự như ở tab Rewrite được hướng dẫn ở phần Rewrite của bài viết này. Tuy nhiên, ở ô Rewrite Rules, có một lệnh thiết lập đặc biệt được phép sử dụng, mở ra khả năng sử dụng file .htaccess:
    rewriteFile <đường dẫn>

    Trong đó, các bạn thay cả phần <đường dẫn> bằng một đường dẫn tuyệt đối đến file .htaccess.

    Tuy nhiên, đừng vội mừng vì điều này! Vì khi lệnh này được áp dụng, OpenLiteSpeed vẫn chỉ xử lí các lệnh RewriteCondRewriteRule trong file .htaccess mà thôi.

  • Rewrite Inherit: Sử dụng lại thiết lập rewrite có ở tab Rewrite đối với context hiện thời. Mình khuyên các bạn nên để nguyên giá trị được chọn là Not Set, khi đó các thiết lập rewrite ở tab Rewrite sẽ được áp dụng đối với context, mà những thiết lập rewrite ở riêng context cũng sẽ được áp dụng.
  • Rewrite Base: Ý nghĩa tương tự lệnh RewriteBase trong file .htaccess. Đường dẫn được ghi ở dòng này sẽ được sử dụng như một “đường dẫn gốc” (base) làm căn cứ cho các phần đường dẫn tương đối được ghi ở các lệnh RewriteCondRewriteRule trong ô Rewrite Rules.
    Mình đưa ra một ví dụ thiết lập rewrite base nhé:

    • Rewrite Base: /abc/
    • Rewrite Rules:
      RewriteRule ^(([a-z0-9\-]+/)*[a-z0-9\-]+)$ $1/ [NC,R=301,L]

    Dòng trên được dùng để bổ sung thêm dấu gạch chéo vào cuối link.

    Một đường link sẽ được rewrite bởi thiết lập trên:

    http://vidu.com/abc/xyz → http://vidu.com/abc/xyz/

    Một số đường link nằm bên ngoài context có thiết lập trên sẽ không được rewrite như vậy:

    http://vidu.com/xyz
    http://vidu.com/abcd/xyz
  • External Redirect (chuyển hướng ra link bên ngoài website): Chọn Yes (có) hoặc No (không).
  • Status Code: Mã số trạng thái HTTP (HTTP status code) được trả về. Để thực hiện chuyển hướng, mã số này cần nằm trong khoảng từ 300 đến 399, rồi sau đó các bạn điền link chuyển hướng đến vào dòng Destination URI.

Sau khi chỉnh sửa xong thiết lập về context, các bạn hãy lưu lại context đó.

Và như thường lệ, cứ mỗi lần thiết lập xong OpenLiteSpeed, chúng ta khởi động lại nó.


Như vậy chúng ta đã biết cách thiết lập rewrite trong OpenLiteSpeed cùng với một số thiết lập khác mà chúng ta từng áp dụng bằng file .htaccess. Hi vọng bài viết này sẽ giúp ích cho các bạn chuyển đổi từ Apache sang OpenLiteSpeed.

Các bạn có thể đọc tiếp về SSL và realm trong OpenLiteSpeed. Đó có thể là bài viết cuối cùng của mình về OpenLiteSpeed, trước khi mình thực hiện các thử nghiệm kết hợp nó với các phần mềm server khác.

Thời gian tới mình có nhiều dự định thử nghiệm:

  • Sử dụng OpenLiteSpeed làm proxy cho Apache. Lí do là một số mã nguồn còn phụ thuộc lớn vào file .htaccess, trong khi không có nhiều người có thể tiếp cận với phiên bản LiteSpeed trả phí để cài đặt lên server riêng. Với lại, mình mong muốn được sử dụng ModSecurity, vốn là một module bảo vệ dành cho Apache (và NGINX), và hiện mới có bản LiteSpeed trả phí là hỗ trợ sẵn ModSecurity.
  • Cài đặt và tối ưu LAMP stack, cùng với NGINX làm proxy bảo vệ và cache tĩnh, APCu và OpCache làm cache cho PHP, và Redis làm cache cho cơ sở dữ liệu.
  • Thử nghiệm hai phần mềm server H2OCaddy.

Mình sẽ không tập trung vào phân tích sâu về tốc độ, mà chủ yếu xem việc điều chỉnh tối ưu có dễ dàng không, và tính năng thực hiện được đến đâu. Có thể các bạn sẽ rất thích các thử nghiệm này đó!

Bài viết này có 9 bình luận

  1. Hiện mình đang cài OpenLiteSpeed trên Ubuntu 16.04, gặp 1 số vấn đề sau
    – Source chạy WP, đã cài đặt SSL thành công nhưng không tự redirect sang https
    – Mình cấu hình rewriteFile để chỉ đường dẫn file .htaccess nhưng cũng không thấy hoạt động

    1. Mình không biết bạn làm theo hướng dẫn viết lệnh rewrite ở trang nào, nhưng ngay từ đầu mình đã bám sát theo wiki của chính OpenLiteSpeed.

      Cơ bản là ngay từ đầu lúc mới cài đặt WordPress thì bạn sẽ không sử dụng .htaccess, mà bạn sẽ chuyển hết các lệnh rewrite trong file đó vào trong bảng Rewrite Rules của virtual host. Về sau, khi cài plugin LiteSpeed Cache thì bạn cứ để cho nó tự tạo file .htaccess, lúc đấy mới cần sử dụng lệnh rewriteFile trong thiết lập context để chỉ định sử dụng file đó.

    2. Nếu cài SSL thành công thì thêm vào file .htaccess

      RewriteCond %{HTTP_HOST} ^www.domain.com$ [NC]
      RewriteRule ^(.*)$ https://domain/$1 [R=301,L]
      RewriteCond %{HTTPS} !on
      RewriteRule ^(.*)$ https://domain%{REQUEST_URI} [R,L]

      Sau đó reset lại server là dc thôi.

  2. Bạn có thể chỉ giúp mình cách chuyển toàn bộ url từ HTTP sang HTTPS được không?

    1. Bạn đang sử dụng chính OpenLiteSpeed hay là Apache, NGINX?

  3. cái subdomain của chính domain mình cơ bác. ví dụ cdn.mydomain.com

    1. Khi chỉnh sửa zone, bạn ấn nút Advanced Settings. Sau đó bạn có thể điền subdomain của riêng bạn vào phần Secondary CDN Hostnames. Tuy nhiên, chú ý rằng là subdomain được thêm vào đó sẽ không sử dụng được SSL (HTTPS), và cũng không có cách nào để bạn cài đặt chứng chỉ SSL có sẵn qua trang chỉnh sửa đó nha.

  4. Bài chất lượng tốt quá. Em đang dùng CDN của NetDepot theo gợi ý của bác, nhưng chưa cấu hình được subdomain. Hình như bác cũng vậy hen.

    Bác thử update xem.

    1. Phần CDN hostname ở đó bạn chỉ cần điền duy nhất một cái tên viết liền, toàn bộ là chữ thường, được phép dùng dấu gạch ngang. Không phải điền dưới dạng đầy đủ. Ví dụ:

      my-cdn

      Sau đó nó tự thêm .r.worldssl.net vào phía sau.

      Khi sử dụng thì tuỳ theo yêu cầu của mã nguồn mà điền theo một trong mấy cách sau:

      my-cdn.r.worldssl.net
      http://my-cdn.r.worldssl.net
      https://my-cdn.r.worldssl.net

Tính năng bình luận đã được đóng.