2010-01-21 32 views
8

Gần đây tôi đã thay đổi CMS của mình và muốn viết lại một số URL của mình để khớp với định dạng thông số chuỗi URL/truy vấn mới.Viết lại URL với các thông số chuỗi truy vấn đã chọn trong .htaccess

URL cũ là:

http://www.mysite.com/search.cgi?tag=foo&blog_id=bar&other=baz 

URL mới nên là:

http://www.mysite.com/?s=foo 

Nói cách khác, có một số thông số chuỗi truy vấn trong các định dạng cũ, nhưng tôi chỉ quan tâm để viết lại số thẻ param đến s trong khi vẫn giữ nguyên giá trị đó. Các thông số khác cần được loại bỏ. Tất nhiên thứ tự của các tham số không quan trọng. Nó cũng không quan trọng cho dù thẻ là tham số duy nhất hay không.

Bất kỳ ý tưởng nào?

Trả lời

10

Bạn có thể thử sử dụng cụm từ và cụm từ thông dụng, nếu máy chủ của bạn hỗ trợ điều đó. Nếu tôi không nhầm bạn phải viết lại chỉ có một tham số, tôi đoán bạn có thể thử một cái gì đó tương tự (nếu bạn đang sử dụng apache với mod_rewrite):

 
RewriteCond %{QUERY_STRING} ^.*(\btag\b=(\w+|&\w+;)+) 
RewriteRule ^(.+) /$1?%1 [L] 

Edit: tôi cải thiện các biểu hiện thường xuyên một chút để khớp "thẻ" bất kể vị trí của nó trong chuỗi truy vấn và để giữ các chuỗi ký tự đặc biệt như & Ngoài ra, nên tránh các kết quả trùng khớp với các tham số tương tự (ví dụ: nó sẽ không khớp với tham số được gọi là "alttag").

Chỉnh sửa # 2: Cách khác (đặc biệt nếu bạn phải lọc nhiều tham số) là sử dụng chương trình bên ngoài để ghi đè. Trang này: http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritemap (đặc biệt phần "Chương trình viết lại bên ngoài") chứa thông tin hữu ích.

+0

Vì vậy,% 1 trong RewriteRule phản ánh kết hợp cụm từ thông dụng trong RewriteCond? – lupefiasco

+2

Có,% 1 được sử dụng để chỉ một nhóm trong RewriteCond, trong khi $ 1 được sử dụng để chỉ một nhóm trong chỉ thị RewriteRule. –

+0

Và làm cách nào tôi có thể thiết lập RewriteUrl của mình để ánh xạ phần /search.cgi? ... thành /? ... – lupefiasco

2

Trên một máy chủ web Apache, đặt sự cai trị sau đây vào .htaccess trong thư mục gốc tài liệu của bạn sẽ ghi đè URL như bạn mô tả:

RewriteCond %{QUERY_STRING} .*\btag=([^&]*).* 
RewriteRule ^search\.cgi /?s=%1 [R=302] 

Nguyên tắc trên sử dụng một chuyển hướng 302, vì vậy trình duyệt của bạn không "học thuộc lòng "quy tắc chuyển hướng trong khi bạn đang thử nghiệm và tinh chỉnh quy tắc. Khi bạn đã hoàn tất kiểm tra, hãy đổi [R] thành [R = 301]. 301 là chuyển hướng vĩnh viễn và tốt hơn cho SEO.

+0

Điều này sẽ chuyển hướng với tham số 's' và nó sẽ hoạt động như được yêu cầu. – goodeye

+0

Quay lại ngay với bạn. +1 – goodeye

1

Đây là một phiên bản khác để nhận được ý nghĩa cụ thể về ý nghĩa của OP. @ smhmic của câu trả lời là gần với điều này. Tôi chỉ thích bắt đầu-hoặc-ampersand rõ ràng để tìm các tham số, chứ không phải là cách tiếp cận từ-ranh giới. (Câu trả lời được chấp nhận là quá phức tạp, và có một số vấn đề.)

RewriteCond %{QUERY_STRING} (?:^|&)tag=([^&]*) 
RewriteRule ^search\.cgi$ /?s=%1 [NC,R=302] 

này được nói:
(?: ) không nắm bắt điều này như một số%
^|& ngay từ đầu của chuỗi truy vấn hoặc sau một dấu và (này hoạt động như ranh giới từ, nhưng đặc biệt cho các url).
tag= thông số chúng tôi đang tìm kiếm.
( ) ghi lại điều này, thành% 1.
[^&]* không hoặc nhiều ký tự không phải là dấu và (và dừng ở dấu và hoặc chạy đến cuối).

+0

Đây là _almost_ chính xác giải pháp của tôi, nhưng regex chính xác hơn. +1 –

Các vấn đề liên quan