2012-01-11 15 views
12

Một vài ngày trước, tôi đã có câu hỏi về việc xóa index.php khỏi thanh địa chỉ, vì vậy địa chỉ của trang trông ngắn hơn và tốt hơn. Giải pháp ngắn nhất của vấn đề này là (RewriteRule ^index.php/[L,R=301] in the .htaccess file). Và nó hoạt động!Dường như giá trị POST bị mất khi sử dụng .htaccess RewriteRule. GET giá trị là OK. Làm thế nào để khắc phục?

Vì tôi đặt chuỗi đó vào .htaccess, một số trang được chuyển hướng đến trang chính. Tôi đã dành rất nhiều thời gian để đoán, tại sao. Theo tôi hiểu, câu trả lời là: với thông số RewriteRule ^index.php/[L,R=301], $ _POST không được gửi đến trang tiếp theo. Các tham số $ _GET là OK. Khi tôi xóa RewriteRule ^index.php/[L,R=301] khỏi .htaccess, mọi thứ trở nên bình thường. Tại sao nó xảy ra và cách khắc phục điều đó?

Cảm ơn bạn.

+1

có cùng một vấn đề với chỉ [L] cờ. Điều này xảy ra khi thay đổi lưu trữ vì vậy tôi đoán đây là, bằng cách nào đó, cấu hình liên quan. – Tsadiq

+0

Đây là liên kết tốt về cờ [P] :) http://stackoverflow.com/questions/358263/htaccess-is-it-possible-to-redirect-post-data – Tsadiq

Trả lời

18

Cờ [R] sẽ phát sinh chuyển hướng. Và tác nhân người dùng phát hành chuyển hướng với yêu cầu GET. Không có gì có thể được thực hiện nếu bạn thực sự muốn rút ngắn URL xuống đường dẫn gốc /.

Bạn tuy nhiên có thể chặn các yêu cầu POST đặc biệt từ được viết lại/chuyển hướng:

RewriteCond %{REQUEST_METHOD} !POST 
RewriteRule ^index.php/[L,R=301] 
4

Giá trị POST sẽ KHÔNG BAO GIỜ tồn tại chuyển hướng bên ngoài (R=301), đó là trách nhiệm bảo mật, do đó các trình duyệt sẽ không bao giờ hỗ trợ điều đó. Xóa R=301 và bạn sẽ ổn. Bạn chỉ nên thay đổi tất cả các liên kết hiện có sang trang thành ngắn hơn/đẹp hơn (<a> nhưng cũng có thể thực hiện các tác vụ khác.)

+1

[R = 301] sẽ ngắt yêu cầu POST (dữ liệu biểu mẫu bị mất), nhưng bỏ nó ra sẽ không ảnh hưởng đến thanh địa chỉ. Vì lý do này, bạn sẽ muốn tránh thực hiện loại viết lại này nếu (bao giờ) BÀI ĐĂNG để lập chỉ mục. – Umbrella

+2

Đúng. Người ta luôn có thể thêm một 'RewriteCond% {REQUEST_METHOD}!POST' trước khi viết lại, nhưng là do dự nghĩ rằng _why bất kỳ hình thức nào vẫn sẽ có index.php như một action_ ... – Wrikken

+0

Thật vậy. Đó sẽ là một câu hỏi hay cho OP. – Umbrella

5

Tôi đang sử dụng một cái gì đó như:

<IfModule mod_rewrite.c> 

RewriteEngine on 

RewriteCond %{REQUEST_URI} !^/(css|images|js)/ 

# don't rewrite existing files, directories and links 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-l 


# rewrite everything else to index.php 

RewriteRule .* index.php [L] 

</IfModule> 

Và nó làm việc cho tất cả các yêu cầu, viết lại nó thông qua chỉ mục. tệp php. Nếu bạn cần chuyển hướng 301 (viết tắt của mã Vĩnh viễn đã di chuyển), hãy xem câu hỏi này: Is it possible to redirect post data?

+0

Điều này có vẻ như thay thế cho xử lý 404 hiện có của apache. Hơn nữa, điều này dường như không giải quyết được câu hỏi. – Umbrella

10

Thay vào đó, bạn có thể thử sử dụng [L,R=307]. 307 không được thay đổi theo yêu cầu-phương pháp theo spec, nhưng tôi không biết làm thế nào trình duyệt thực hiện 307.

Nhưng gốc rễ của vấn đề là việc sử dụng các <form action="____/index.php" ...

Chỉ cần rời khỏi hành động trống để POST vào url hiện tại, ví dụ

1

tôi đã có vấn đề tương tự nhưng htacces của tôi là như thế này:

RewriteEngine on 
RewriteRule .* index.php [NC] 

Chỉ cần thay đổi NC cho L và tất cả mọi thứ hoạt động tốt.

mã cuối cùng:

RewriteEngine on 
RewriteRule .* index.php [L] 
Các vấn đề liên quan