Bạn có thể làm như sau bằng cách sử dụng mod_rewrite:
Viết LạiEngine Trên
RewriteCond %{QUERY_STRING} (?:^|&)p1=([^&]+)
RewriteCond %1@%{QUERY_STRING} ^([^@]+)@(?:|.*&)p2=([^&]*)
RewriteRule ^/?(my-page)$ /$1/%1/%2 [QSD,R=302,L]
đầu tiên điều kiện, tình trạng, trạng thái nắm bắt giá trị của p1
và chuyển cái này sang cái thứ hai điều kiện, tình trạng, trạng thái điều đó cũng nắm bắt được giá trị của p2
. Sau đó chúng được sử dụng trong thay thế chuỗi như %1
và %2
phản hồi tương ứng.
Các tham số URL có thể xuất hiện theo bất kỳ thứ tự nào.
@
(trong điều kiện thứ hai) chỉ là một ký tự tùy ý không xuất hiện trong v1
và so được sử dụng như một dấu phân cách giữa v1
và chuỗi truy vấn khi tìm kiếm p2
.
Tất cả các tham số URL khác (tức là. p3
..pN
) bị bỏ qua (và bị loại bỏ).
Cả hai p1
và p2
phải tồn tại với một giá trị không trống để chuyển hướng xảy ra.
CẬP NHẬT: p1
phải tồn tại với một giá trị không trống (nếu không, chuyển hướng kết quả sẽ không rõ ràng). p2
cũng phải tồn tại, nhưng giá trị có thể là trống rỗng. Tôi cũng đã cập nhật biểu thức chính quy để nó cũng cho phép chuỗi truy vấn được cho là không đúng định dạng (nhưng vẫn hợp lệ) trong đó dấu phân cách tham số URL (&
) xảy ra trước p2
ở đầu chuỗi truy vấn. ví dụ. /trang của tôi?&p2=&p1=v1
vẫn sẽ được chuyển hướng đến /my-trang/v1/
.
Các QSD
cờ loại bỏ chuỗi truy vấn ban đầu khỏi yêu cầu.
Tùy thuộc vào nơi các chỉ thị này đang được sử dụng (ví dụ. danh mục hoặc người phục vụ bối cảnh) và cách URL cuối cùng được định tuyến, bạn có thể cần thêm một điều kiện ban đầu để đảm bảo rằng chỉ những yêu cầu trực tiếp (trái ngược với yêu cầu viết lại) mới được xử lý.
Ví dụ: thêm phần sau đây làm điều kiện đầu tiên nếu được yêu cầu:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
:
CẬP NHẬT:
p1 và p2 là bắt buộc. p3 là tùy chọn.
Bạn có thể thay đổi ở trên như sau:
RewriteCond %{QUERY_STRING} (?:^|&)p1=([^&]+)
RewriteCond %1@%{QUERY_STRING} ^([^@]+)@(?:|.*&)p2=([^&]+)
# P3 là bắt buộc và phải có giá trị
RewriteCond %1/%2/@%{QUERY_STRING} ^([^@]+)@(?:|.*&)p3=([^&]+) [OR]
# HOẶC p3 bị bỏ qua hoặc không có giá trị
RewriteCond %1/%2 (.+)
RewriteRule ^/?(my-page)$ /$1/%1%2 [QSD,R,L]
Điều kiện thứ 2 bây giờ đảm bảo có một giá trị cho p2
tham số (tức là v2
) - không được để trống.
Sau đó, điều kiện thứ 3 sẽ kiểm tra đối tượng không trống p3
tham số HOẶC điều kiện thứ 4 chỉ đơn giản là nắm bắt các giá trị khi p3
tham số trống hoặc bị bỏ qua hoàn toàn.
Chuyển hướng kết quả bỏ qua dấu gạch chéo khi p3
không phải bây giờ. Ví dụ: chuyển hướng kết quả là /mypage/v1/v2
hoặc /mypage/v1/v2/v3
. (Dấu gạch chéo sau có thể xảy ra trên /mypage/v1/v2/
được tránh.)
trong trận chung kết thay thế chuỗi, các giá trị của %1
và %2
phản hồi có một chút khác biệt so với trước đây. Chúng không còn chứa từng giá trị (tức là. v1
và v2
). Thay thế %1
chứa v1/v2
và %2
chứa một trong hai /v3
(bao gồm cả tiền tố gạch chéo) hoặc là trống rỗng (khi nào p3
trống hoặc bị bỏ qua).