Vào thẳng nội dung

Giới thiệu về mod_rewrite#

mod_rewrite là gì#

mod_rewrite là một module của Apache, cung cấp cách sửa các yêu cầu URL gửi đến một cách tự động, cú pháp dựa theo quy tắc của regualar expression. mod_rewrite cho phép bạn ánh xạ URL tùy thích vào cấu trúc URL theo cách bạn muốn.

Các rewrite rule có thể được sử dụng ở server (httpd.conf), trong virtualhost (<VirtualHost>), trong thư mục (file .htaccess và block <Directory>). Kết quả của rewrite có thể dẫn đến các quy tắc khác, xử lý khác, tùy thuộc vào đặt flag kèm theo.

Regular expression trong mod_rewrite#

mod_rewrite sử dụng PCRE (Perl Compatible Regular Expression) để viết các quy tắc.

Dưới đây là bảng regex thường hay sử dụng:

Ký tự Nghĩa Ví dụ
. khớp bất kỳ ký tự đơn nào c.t sẽ khớp với cat, cot, cut...
+ lặp lại ký tự trước 1 hoặc nhiều lần a+ sẽ khớp với a, aa, aaa...
* lặp lại ký tự trước 0 hoặc nhiều lần a* sẽ khớp giống với a+ nhưng khớp thêm chuỗi trống (empty).
? lặp lại ký tự trước 0 hoặc 1 lần colou?r sẽ khớp với colorcolour
^ khớp tại vị trí bắt đầu của một chuỗi ^a sẽ khớp với chuỗi bắt đầu bằng a
$ khớp tại vị trí kết thúc của 1 chuỗi a$ sẽ khớp với chuỗi kết thúc với a.
( ) nhóm nhiều ký tự vào 1 khối và ghi lại, có thể sử dụng lại khối đó bằng backreference trong mẫu regex (ab)+ sẽ khớp với ab, abab, ababab,...
[ ] lớp ký tự - khớp với một trong các ký tự trong dấu [] c[uoa]t sẽ khớp với cut, cot hoặc cat
[^ ] phủ định lớp ký tự - khớp với bất kỳ ký tự nào không được chỉ định trong dấu [] c[^/]t khớp với cat, cut, c=t hoặc bất kỳ ký tự nào nằm giữa c và t nhưng không phải dấu /.

Trong mod_rewrite dấu ! có thể sử dụng trước 1 regex để mang ý nghĩa phủ định.

Backreference (tham chiếu ngược) trong Regex:

Một điều cần nhớ, bất cứ khi nào sử dụng group (), các backreference được tạo có thể được sử dụng bằng $n%n. Đây là các tham số thay thế các nhóm được tạo trong Regex.

Các group tạo trong regex trước đó được ghi lại, đánh số, và có thể sử dụng các group này lại với backreference $n%n.

Các bản ghi trong mẫu RewriteRule có thể được sử dụng trong chỉ thị RewriteCond phía trước, đó là bởi vì biểu thức trong RewriteRule được chạy trước.

Xem hình minh họa bên dưới, vị trí của backreference được di chuyển để mở rộng cũng như để minh họa dòng chảy của RewriteRule và RewriteCond.

Backreference

Ở hình trên: một yêu cầu /test/1234 được chuyển hướng thành /admin.foo?page=test&id=1234&host=admin.example.com.

Cấu trúc URL#

1. Cấu trúc URL

Cấu trúc URL gồm những phần sau:

url structure

url structure

Ví dụ 1 link: http://www.example.com:80/path/to/myfile.html?key1=value1&key2=value2#SomewhereInTheDocument

Tách URL thành từng phần ta có:

  • http : Protocol
  • www.example.com : Domain name (host)
  • :80 : port
  • /path/to/myfile.html : path
  • ?key1=value1&key2=value2 : là các tham số truy vấn, được liệt kê thành các cặp key/value, phân cách nhau bởi dấu &
  • #SomewhereInTheDocument : anchor (neo) hay còn gọi là fragment, được dùng để nhảy tới 1 phần khác của trang hiện tại.

2. URL tuyệt đối và tương đối

https://developer.mozilla.org/en-US/docs/Learn/Common_questions/What_is_a_URL#Absolute_URLs_vs_relative_URLs

RewriteBase#

Chỉ thị RewriteBase chỉ định tiền tố URL (URL prefix) được sử dụng cho per-dir (htaccess) của chỉ thị RewriteRuleSubstitutionđường dẫn tương đối.

Cú pháp RewriteBase URL-path

Chỉ thị này buộc sử dụng khi substitution (trong ngữ cảnh per-dir) là đường dẫn tương đối. Trừ 1 trong các trường hợp sau:

  • Yêu cầu rewrite và đường dẫn của substitution là tương đối so với vị trí DocumentRoot.
  • Đường dẫn tương đối của substitution là 1 đường dẫn thật trên server (ít gặp).
  • Trong phiên bản Apache 2.4.16 trở về sau, chỉ dẫn này có thể bỏ qua khi yêu cầu được ánh xạ qua Alias hoặc mod_userdir.

Trong ví dụ bên dưới, RewriteBase là cần thiết để tránh viết lại thành http://example.com/opt/myapp-1.2.3/welcome.html khi tài nguyên không liên quan tới DocumentRoot

1
2
3
4
5
6
7
DocumentRoot "/var/www/example.com"
AliasMatch "^/myapp" "/opt/myapp-1.2.3"
<Directory "/opt/myapp-1.2.3">
    RewriteEngine On
    RewriteBase "/myapp/"
    RewriteRule "^index\.html$"  "welcome.html"
</Directory>

RewriteCond#

RewriteCond định nghĩa điều kiện cho quy tắc. Có thể sử dụng 1 hoặc nhiều RewriteCond trước RewriteRule để áp dụng các điều kiện khớp với pattern của RewriteRule.

RewriteCond TestString CondPattern [flag]

RewriteCond

RewriteCond có 3 tham số như sau:

  • TestString: biến mô tả đặc tính của yêu cầu, có dạng %{VARIABLE}. Xem thêm
  • CondPattern (mẫu điện kiện): là 1 regex phải khớp với biến.
  • Flags (tùy chọn): bao gồm
    • nocase|NC (no case): không phân biệt chữ hoa thường
    • ornext|OR (or next condition): sử dụng OR thay vì mặc định là AND để kết hợp giữa nhiều CondPattern. Ví dụ:
      1
      2
      3
      4
      RewriteCond "%{REMOTE_HOST}"  "^host1"  [OR]
      RewriteCond "%{REMOTE_HOST}"  "^host2"  [OR]
      RewriteCond "%{REMOTE_HOST}"  "^host3"
      RewriteRule ...some special stuff for any of these hosts...
      
    • novary|NV (no vary)

TestString#

TestString là một chuỗi có cấu trúc mở rộng:

  • Backreference trong RewriteRule: là các ký hiệu tham chiếu có dạng $n (n từ 0->9). Các ký hiệu từ $1-$9 truy cập đến các nhóm (nằm trong dấu ngoặc đơn) của Pattern (RewriteRule). $0 tham chiếu tới toàn bộ chuỗi trùng khớp với pattern.
  • Backreference trong RewriteCond: là các ký hiệu tham chiếu có dạng %n (n từ 0->9). Các ký hiệu từ %1-%9 truy cập đến các nhóm (nằm trong dấu ngoặc đơn) của CondPattern (RewriteCond). %0 tham chiếu tới toàn bộ chuỗi trùng khớp với CondPattern.

    Backreference in rewrite

  • Mở rộng của RewriteMap: các phần mở rộng có dạng ${mapname:key|default}. Xem thêm RewriteMap

  • Server-Variable: là các biến server có dạng %{ten_bien}.

    Các biến server bao gồm:

    HTTP headers: HTTP_ACCEPT, HTTP_COOKIE, HTTP_FORWARDED, HTTP_HOST, HTTP_PROXY_CONNECTION, HTTP_REFERER, HTTP_USER_AGENT

    server internals: DOCUMENT_ROOT, SCRIPT_GROUP, SCRIPT_USER, SERVER_ADDR, SERVER_ADMIN, SERVER_NAME, SERVER_PORT, SERVER_PROTOCOL, SERVER_SOFTWARE

    connection & request: AUTH_TYPE, CONN_REMOTE_ADDR, CONTEXT_PREFIX, CONTEXT_DOCUMENT_ROOT, IPV6, PATH_INFO, QUERY_STRING, REMOTE_ADDR, REMOTE_HOST, REMOTE_IDENT, REMOTE_PORT, REMOTE_USER, REQUEST_METHOD, SCRIPT_FILENAME

    date and time: TIME_YEAR, TIME_MON, TIME_DAY, TIME_HOUR, TIME_MIN, TIME_SEC, TIME_WDAY, TIME

    specials: API_VERSION, CONN_REMOTE_ADDR, HTTPS, IS_SUBREQ, REMOTE_ADDR, REQUEST_FILENAME, REQUEST_SCHEME, REQUEST_URI, THE_REQUEST

Một số biến thường hay gặp:

Tên biến Mô tả
DOCUMENT_ROOT giống với chỉ thị DocumentRoot được cấu hình trên thiết lập server/virtual host.
HTTPS on nếu yêu cầu sử dụng https, ngược lại là off
HTTP2 on nếu sử dụng http2, ngược lại off
HTTP_HOST hostname trong http://hostname
HTTP_REFERER địa chỉ URL dẫn tới yêu cầu hiện tại
REMOTE_ADDR Địa chỉ IP của remote host
REQUEST_FILENAME Đường dẫn hệ thống đầy đủ tới file script khớp với yêu cầu. Nếu sử dụng trong virtual host, nó có giá trị giống với REQUEST_URI.
REQUEST_URI là đường dẫn sau http://hostname, không chứa chuỗi truy vấn (phần sau dấu ?). Ví dụ /index.html
SCRIPT_FILENAME giống với REQUEST_FILENAME

CondPattern#

CondPattern là mẫu điều kiện, một regex được áp dụng tới TestString hiện tại. TestString được đánh giá trước khi được so khớp với CondPattern.

CondPattern thường là 1 regex, nhưng có thêm những cú pháp khác bổ sung gồm:

  1. Bắt đầu với dấu ! để phủ định kết quả của điều kiện
  2. Có thể bắt đầu với các toán tử so sánh (>, <, =, <=, >=)
  3. So sánh với số nguyên: Xem như TestString là 1 số nguyên và được so sánh với CondPattern cũng là 1 số nguyên. Kết quả là true hoặc false

    Bắt đầu với các từ:

    • -eq: equal (bằng)
    • -ge: greater than or equal (lớn hơn hoặc bằng)
    • -gt: greater than (lớn hơn)
    • -le: less than or equal (nhỏ hơn hoặc bằng)
    • -lt: less than (nhỏ hơn)
    • -ne: not equal (không bằng). Tương đương với cách viết !-eq
  4. Kiểm tra các thuộc tính: dùng để kiểm tra thuộc tính của TestString, kết quả trả về true hoặc false.

    • -d: đây là thư mục (directory)
    • -f: đây là file (file)
    • -F: kiểm tra có tồn tại 1 file thông qua yêu cầu phụ
    • -l, -L, -h: kiểm tra đây là 1 đường link (symbolic link)
    • -s: đây là file có kích thước (size) lớn hơn 0
    • -U: kiểm tra có tồn tại 1 URL thông qua yêu cầu phụ
    • -x: có quyền thực thi

    Ví dụ:

    1
    2
    RewriteCond /var/www/%{REQUEST_URI} !-f
    RewriteRule ^(.+) /other/archive/$1 [R]
    
  5. Nếu TestString có giá trị đặc biệt expr, CondPattern sẽ được coi là một ap_expr

Flag#

Ví dụ để gửi tất cả yêu cầu từ 1 dãy IP cụ thể đến một máy chủ khác, sử dụng:

1
2
RewriteCond "%{REMOTE_ADDR}" "^10\.2\."
RewriteRule "(.*)" "http://intranet.example.com$1"

Khi chỉ định nhiều hơn một RewriteCond, tất cả chúng phải khớp với RewriteRule muốn áp dụng. Ví dụ: Để từ chối các yêu cầu chứa từ "hack" trong chuỗi truy vấn, trừ khi chúng cũng chứa 1 cookie chứa từ "go"

1
2
3
RewriteCond "%{QUERY_STRING}" "hack"
RewriteCond "%{HTTP_COOKIE}" "!go"
RewriteRule "." "-" [F]

Dấu chấm than ! chỉ định kết quả phủ định, vì vậy rule trên chỉ được áp dụng nếu cookie không chứa từ "go"

CondPattern trong RewriteCond có thể được sử dụng trong Substitution của RewriteRule bằng các biến %1, %2 ...Ví dụ: chuyển các yêu cầu tới 1 thư mục khác dựa trên hostname đươc

1
2
RewriteCond %{HTTP_HOST} (.*)
RewriteRule ^/(.*) /sites/%1/$1

Theo ví dụ trên: nếu yêu cầu cho địa chỉ http://example.com/foo/bar, lúc này %1 sẽ là example.com, $1foo/bar -> kết quả sẽ là: http:/example.com/sites/example.com/foo/bar

Xem hình sau để hiểu rõ hơn:

Nhóm CondPattern thể hiện bằng dấu () sử dụng trong RewriteCond được ghi lại vào backreferences %1, %2, ...

RewriteEngine#

RewriteEngine cho phép bật hoặc tắt Rewrite. Dùng chỉ thị này để vô hiệu hóa các quy tắc rewrite trong một số trường hợp, thay vì dùng dấu # tại các chỉ thị RewriteRule.

Cú pháp: RewriteEngine on|off

Các thiết lập rewrite không được kết thừa bởi virtual host. Điều này có nghĩa là bạn cần phải có một chỉ thì RewriteEngine on cho mỗi virtual host mà bạn muốn áp dụng các quy tắc rewrite.

RewriteRule#

RewriteRule có 3 tham số, cách nhau bởi dấu cách:

RewriteRule pattern substitution [flag]

rewriterule

Pattern#

Pattern (mẫu tìm kiếm) là 1 regular expression (Regex) để khớp với URL của yêu cầu hiện tại. là 1 phần của URL nằm sau http://hostname, không chứa các tham số query (như ?search)

Để phủ định kết quả của Regex, dùng dấu chấm than !

RewriteRule !regex substitution [flags]

Substitution#

Substitution (thay thế) hay còn gọi là target, là một chuỗi muốn thay thế với pattern được tìm thấy. Có thể là đường dẫn tuyệt đối tới 1 file, địa chỉ URL đầy đủ muốn chuyển hướng hoặc dấu - để không làm gì.

Ghi chú

Có thể hiểu đơn giản về RewriteRule:

"Nếu yêu cầu tìm thấy URL giống pattern thì nó sẽ được thay thế với substitution"

Substitution có thể là 1 trong 3 kiểu sau:

  • Một đường dẫn đầy đủ tới 1 tài nguyên trên server

    RewriteRule "^/games" "/usr/local/games/web"

  • Một đường dẫn URL tuyệt đối

    RewriteRule "^/product/view$" "http://site2.example.com/seeproduct.html" [R]

  • Một đường dẫn 1 tài nguyên web (url tương đối dựa theo chỉ thị DocumentRoot)

    RewriteRule "^/foo$" "/bar"

Các kiểu substitution trên có thể khác nhau tùy thuộc ngữ cảnh (context) của RewriteRule, bao gồm:

Backreference trong substitution#

Ngoài ra substitition cũng sử dụng backreference (tham chiếu ngược) để khớp với các nhóm trong Pattern.

Ví dụ:

RewriteRule "^/product/(.*)/view$" "/var/web/productdb/$1"

Biến $1 sẽ được thay thế với (.*) trong pattern. Nếu theo ví dụ trên, yêu cầu tới http://example.com/product/r14df/view sẽ được ánh xạ tới /var/web/productdb/r14df

Nhóm regex thể hiện bằng dấu () sử dụng trong RewriteRule được ghi lại vào backreferences $1, $2, ...

Flag#

Flag là các hành động đặc biệt điều khiển hành vi của quy tắc RewriteRule, flag là tùy chọn, có thể là định nghĩa biến, điều khiển header, redirect, deny...

Một số flag có thể kết hợp lại với nhau, phân cách bởi dấu phẩy.

Một số flag hay sử dụng:

  1. F (Fobidden): trả về Forbidden (mã lỗi 403) cho URL yêu cầu. Thường sử dụng để chặn truy cập 1 URL nhất định.

    Ví dụ: cấm truy cập các file .mp3 nếu remote host đến từ 1 domain chỉ định

    1
    2
    3
    RewriteEngine On
    RewriteCond %{REMOTE_HOST} "riaa.com"
    RewriteRule \.mp3$ - [F]
    
  2. L (Last): đánh dấu rule hiện tại là cuối cùng, dừng xử lý các quy tắc bên dưới ngay lập tức.

    Ví dụ: Quy tắc đầu rewrite URL /old/ thành /new/ với flag L, nên quy tắc thứ 2 sẽ không được kiểm tra. Điều này giúp tiết kiệm thời gian xử lý hơn.

    1
    2
    RewriteRule ^/old/(.*) /new/$1 [L]
    RewriteRule ^/new/$ /new/index.php [L]
    

    Lưu ý

    Nếu substitution tồn tại trong ngữ cảnh per-dir (trong .htaccess<Directory>), sử dụng với flag [L] sẽ xảy ra chuyển hướng nội bộ (link bên ngoài hay external link không bị ảnh hưởng). Nghĩa là tất cả quy tắc có thể xử lý lặp lại nếu việc chuyển hướng tiếp tục khớp với cấu hình rewriterule một lần nữa

    Để chặn vòng lặp có thể dùng điều kiện RewriteCond trước quy tắc đó

    Ví dụ:

  3. NC (No Case): Không phân biệt hoa thường

  4. QSA (Query String Append): thêm vào chuỗi truy vấn (phần URL sau dấu ?) hiện tại.

    Ví dụ: chuyển số id sản phẩm sang chuỗi truy vấn product_id

    1
    RewriteRule ^/product/([0-9]*)/?    /product.php?product_id=$1    [QSA]
    

    Thay vào URL là: http://mysite.com/product/1351283/?view=short

    Kết quả URL sau khi Rewrite là: http://mysite.com/product.php?product_id=1351283&view=short

    Flag QSA đã thêm vào chuỗi truy vấn hiện tại (view=short) 1 chuỗi truy vấn mới (product_id=1351283).Nếu không dùng flag QSA, chuỗi truy vấn mới sẽ thay thế chuỗi truy vấn đã tồn tại trước đó.

    Nếu không có flag QSA: http://example.com/product.php?product_id=1351283

  5. R (Redirect): Ép buộc chuyển hướng. Nếu thay thế với URL đầy đủ (bao gồm http://servername/), nó sẽ tạo chuyển hướng ra bên ngoài.

    Có thể chỉ định mã trạng thái (status code) trong khoảng 300-400 kèm theo flag R. Mã trạng thái mặc định là 302 (moved temporarily) hay còn gọi là chuyển hướng tạm thời. Xem thêm về HTTP Status code

    Mã trạng thái không nhất thiết là mã chuyển hướng (3xx). Nhưng nếu dùng mã trạng thái nằm ngoài khoảng chuyển hướng (3xx), thì thay thế (substitution) bị hủy bỏ, và Rewrite bị dừng lại như thể đang sử dụng flag L.

    Thường hay sử dụng flag R kèm với flag L, tức là [R,L]. Bởi vì flag R thêm http://hostname vào URI, nhưng sau đó truyền kết quả này vào quy tắc tiếp theo trong ruleset, mà thường dẫn đến lỗi "Invalid URL in request"

    Ví dụ: Chuyển hướng mọi yêu cầu đến trang web của bạn tới cùng URL trên 1 trang web khác. Sử dụng mã chuyển hướng 303

    Từ URL: http://your.host.com/something/here chuyến hướng tới http://other.example.net/something/here

    1
    2
    RewriteEngine On
    RewriteRule (.*) http://other.example.com$1 [R=303]
    

    Flag R cũng có thể viết là redirect

    RewriteRule (.*) http://other.example.com$1 [redirect=303]

    Có thể dùng chữ đại diện cho các mã trạng thái như sau: temp (mã 302), permanent (301), seeother (303).

    RewriteRule (.*) http://other.example.com$1 [redirect=permanent]

Xem thêm

[Xem thêm] các flag khác(https://httpd.apache.org/docs/2.4/rewrite/flags.html)

Trình tự xử lý của rewrite#

Cho một đoạn mã rewrite

1
2
3
4
RewriteEngine On
RewriteCond b=b
RewriteCond c=c
RewriteRule ^/a$    /b

Một suy nghĩ sai lầm là các điều kiện được xử lý trước pattern của RewriteRule. Nhưng thực tế thứ tự được xử lý như sau:

  • Pattern của RewriteRule (^/a$) được kiểm tra đầu tiên.
  • Nếu pattern trả về true (hợp lệ)
  • thì điều kiện b (Cond b) sẽ được kiểm tra.
  • Nếu Cond b là true hoặc điều kiện b sử dụng flag OR
  • thì điều kiện thứ 2 (Cond c) sẽ được kiểm tra.
  • Nếu Cond c là true
  • thì substitution trong RewriteRule được áp dụng.

Ví dụ:

Rewrite trong .htaccess#

Rewrite có thể được viết trên thiết lập chính của server (bên ngoài section <Directory>), hoặc trong <VirtualHost>. Tuy nhiên có thể thiết lập Rewrite bên trong section <Directory> hoặc file .htaccess.

Sự khác biệt chính khi viết Rewrite trên .htaccess là tiền tố (prefix) của thư mục chứa file .htaccess được bỏ qua trước khi khớp trong RewriteRule. Ngoài ra RewriteBase nên được sử dụng để đảm bảo yêu cầu được ánh xạ chính xác.

Context (ngữ cảnh)#

Context cho biết vị trí các file thiết lập chứa các chỉ thị (directive) hợp lệ.

  • server config

    Các chỉ thị được sử dụng trong file thiết lập chính của server (httpd.conf và các file include của nó). Chúng không nằm trong <VirtualHost> hoặc <Directory> hoặc file .htaccess.

  • virtual host

    Các chỉ thị nằm trong block <VirtualHost> trong file thiết lập chính của server.

  • directory

    Các chỉ thị được sử dụng trong các block <Directory>, <Location>, <Files>, <If><Proxy> trên file thiết lập chính của server.

  • .htaccess

    Các chỉ thị nằm trong file .htaccess của mỗi thư mục (per-directory).

Dấu gạch chéo trái / trong pattern mod_rewrite#

Trong pattern của chỉ thị RewriteRule, phần hostname được bỏ qua, phần request URI là 1 regex.

Cấu trúc RewriteRule:

RewriteRule pattern substitution [flag]

Ví dụ: 1 link http://example.com/path/to/hello-world/

Ở đây hostname sẽ là http://example.comRequest URI (URL path)/path/to/hello-world/

Cách sử dụng pattern Request URI của RewriteRule trong VirtualHost và trong file .htaccess có sự khác biệt:

  • Trong VirtualHost: sử dụng dấu gạch chéo trái (/) ở đầu câu. Ví dụ: Request_uri là /path/to/hello-world/
  • Trong .htaccess: không sử dụng dấu gạch chéo trái (/) ở đầu câu. Ví dụ: Request_uri là path/to/hello-world/;

    Vì file .htaccess được đặt trong folder muốn áp dụng mod_rewrite, là 1 URL tương đối theo vị trí chứa chúng.

Có một cách để dùng 1 pattern cho cả hai trường hợp là sử dụng dấu ? như sau: /?

Khi nào không nên sử dụng mod_rewrite#

Trường hợp phổ biến nhất sử dụng mod_rewrite là khi bạn không có quyền truy cập server. Bắt buộc lúc này bạn phải sử dụng .htaccess

Các Redirection (chuyển hướng) đơn giản

mod_alias cung cấp chỉ thị RedirectRedirectMatch, dùng để chuyển hướng 1 URL tới địa chỉ khác. Đây là chuyển hướng URL đơn giản tới vị trí khác. Nên sử dụng các chỉ dẫn này thay vị dùng RewriteRule. RedirectMatch cho phép bạn sử dụng regex.

Ví dụ:

  • Chuyển hướng tất cả URL /one tới http://one.example.com

Thay vì dùng RewriteRule, có thể dùng chỉ thị Redirect để chuyển hướng. Chỉ thị Redirect giữ lại thông tin path (đường dẫn), nghĩa là các path sau URL đó vẫn được chuyển hướng theo thay đổi redirect gốc.

1
Redirect "/one" "http://one.example.com"
  • Để chuyển hướng hostname, như chuyển example.com tới www.example.com, cần thiết lập trong virtual host như sau:
1
2
3
4
5
6
7
8
9
<VirtualHost *:80>
  ServerName example.com

  Redirect "/" "http://www.example.com/"
</VirtualHost>

<VirtualHost *:80>
  ServerName www.example.com
</VirtualHost>
  • Chuyển hướng tất cả yêu cầu http sang https, thiết lập virtual host như sau:
1
2
3
4
5
6
7
8
9
<VirtualHost *:80>
    ServerName www.example.com
    Redirect "/" "https://www.example.com/"
</VirtualHost>

<VirtualHost *:443>
    ServerName www.example.com
    # ... SSL configuration goes here
</VirtualHost>

Nếu chỉ thị RedirectRewriteRule trong cùng phạm vi, chỉ thị RewriteRule thích hợp sử dụng hơn vì nó sẽ chạy đầu tiên.

Proxy đơn giản

RewriteRule cung cấp flag [P] để truyền URL được viết lại thông qua mod_proxy

1
RewriteRule "^/?images(.*)" "http://imageserver.local/images$1" [P]

Tuy nhiên, trong nhiều trường hợp sử dụng chỉ thị ProxyPass là tốt hơn

1
ProxyPass "/images/" "http://imageserver.local/images/"

Lưu ý: Cho dù bạn sử dụng RewriteRule hay ProxyPass, bạn vẫn cần sử dụng chỉ thị ProxyPassReverse để bắt các chuyển hướng được cung cấp từ server back-end.

1
ProxyPassReverse "/images/" "http://imageserver.local/images/"
^