2010-07-23 9 views
8

Điều gì sai với quy tắc ghi đè này?RewriteRule giữ nguyên tham số GET

RewriteRule ^api/(.+)$ api/index.php?url=$1 [L] 

Tôi chỉ muốn "index.php? Url =" được thêm sau api/và trước phần còn lại của tham số nhận được.

api/image/upload&arg1=1&text=lorem+ipsum 

để

api/index.php?url=image/upload&arg1=1&text=lorem+ipsum 

Điều gì là sai với (. +) Để có được tất cả mọi thứ sau api /?

+0

^api/([a-zA-Z0-9/_ \ & \ = \%] +) $ hoạt động nhưng sẽ không hoạt động với các ký tự cụ thể của ngôn ngữ khác như åäöøæé và cứ thế ... Đó là lý do tại sao tôi như^api /(.+)$ để làm việc thay thế. . nên có nghĩa là bất kỳ ký tự nào ngoại trừ ngắt dòng hoặc kết thúc chuỗi để tôi không hiểu tại sao nó không hoạt động. – Tirithen

+0

có thể trùng lặp của [giữ thông số url với htaccess viết lại] (http://stackoverflow.com/questions/4071155/keep-url-parameters-with-htaccess-rewrite) –

Trả lời

19

Regex trên RewriteRule chỉ chạy trên phần đường dẫn của URL chứ không phải tham số truy vấn. May mắn thay có [QSA] flag để duy trì các tham số truy vấn hiện tại.

+0

Tuyệt vời! Điều này giải quyết vấn đề của tôi! Tôi có allso tìm thấy một chức năng JS để url mã hóa tất cả không một zA-Z0-9_. các ký tự http://cass-hacks.com/articles/code/js_url_encode_decode/ – Tirithen

+0

Cảm ơn rất nhiều! –

+0

QSA đã cứu tôi! Cảm ơn ngài! –

0

Bạn đang làm điều gì đó để dừng đệ quy vô hạn?

RewriteRule ^api/(.+)$ api/index.php?url=$1 [R=301,L] 

hoặc một số tương đương

+0

Tôi đã có [L] trước đây nhưng nó không thực hiện bất kỳ sự khác biệt. Vấn đề của tôi là apache2 báo cáo rằng tham số get chỉ là [url] => index.php, tất cả các tham số khác đều biến mất và tham số url phải là 'image/upload'. Khi tôi sử dụng quy tắc^api/([a-zA-Z0-9/_] +) $ thay vì tham số url là 'image/upload' nhưng thay vào đó, tôi xóa tất cả các tham số GET khác. – Tirithen

+0

Tôi allso không cố gắng để làm một chuyển hướng, chỉ nhận được văn bản giữa api/và trước khi đầu tiên & để có được chuỗi tiền tố của "index.php? Url =" và phần còn lại của các tham số GET được bảo quản – Tirithen

+0

Làm thế nào để ' R = 301' làm việc ở đây? Tài liệu không có trong tài liệu tại http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html –

0

Tôi nghĩ rằng bạn phải viết tên miền của bạn trước khi những thứ regex. Như thế này:

RewriteRule ^(.+).com/api/(.*)$ "$1.com/api/index.php?url=$2" [R=301,L]