2012-10-13 17 views
25

Tôi muốn mod_rewrite URL vào một trang khác, nhưng sau đó tôi cũng muốn bất kỳ chuỗi truy vấn nào được thêm vào để được giữ nguyên.Tôi làm cách nào để mod_rewrite và giữ chuỗi truy vấn?

RewriteEngine On 

#enforce trailing slashes 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !# 
RewriteCond %{REQUEST_URI} !(.*)/$ 
RewriteRule ^(.*)$ http://localhost/siteroot/$1/ [L,R=301] 

RewriteRule ^apps/([A-Za-z0-9-_]+)/?$ index.php&app=$1 

Vì vậy, nếu người dùng truy cập apps/app1/, index.php?app=app1 được hiển thị. Tuy nhiên, tôi muốn có thể duy trì các chuỗi truy vấn tùy chọn để truy cập apps/app1/?variable=x trả về index.php?app=app1&variable=x.

Quy tắc/điều kiện mod_rewrite nào sẽ làm cho điều này xảy ra?

Trả lời

49

Bạn cần phải thêm [QSA] flag ("chuỗi truy vấn append")

RewriteRule ^apps/([A-Za-z0-9-_]+)/?$ index.php&app=$1 [L,QSA] 

Đối với trang 301 chuyển hướng với [R] cờ như trái ngược với viết lại nội như thế này, chuỗi truy vấn được tự động thêm. Tuy nhiên, bạn phải ép buộc với [QSA] để ghi đè nội bộ.

+0

Cảm ơn, tôi đã không nhận ra điều đó thật đơn giản. –

+1

+1 Đồng ý với @DanielOakey .. Tôi đã cố gắng để hack một cái gì đó với regex và nó không hoạt động .. –

+2

Để làm rõ, nó không phải về viết lại vs chuyển hướng. http://httpd.apache.org/docs/current/rewrite/flags.html#flag_qsa nói: Khi URI thay thế chứa chuỗi truy vấn, hành vi mặc định của RewriteRule là hủy bỏ chuỗi truy vấn hiện tại và thay thế nó với bản mới được tạo. Sử dụng cờ [QSA] làm cho các chuỗi truy vấn được kết hợp. –

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