2008-12-11 41 views
46

Tôi có một trang web nơi tất cả các yêu cầu được chuyển hướng âm thầm (qua .htaccess) đến index.php và sau đó PHP được sử dụng để hiển thị trang chính xác (bằng cách phân tích cú pháp REQUEST_URI).Có thể chuyển hướng dữ liệu bài đăng không?

Tôi đã tự hỏi liệu có thể gửi dữ liệu POST đến địa chỉ giả không?

Tôi hiện đang có hình thức của tôi như vậy ...

<form action="/send-mail" method="post"> 

Và quy tắc .htaccess của tôi là ...

# redirect mail posting to index 
RewriteRule send-mail index.php?send-mail [NC,L] 

My index.php kiểm tra isset($_GET['send-mail']) mà hoạt động tốt.

Tuy nhiên, điều này dường như làm giảm tất cả dữ liệu POST sẽ được gửi tới nó.

Có cách nào để giữ dữ liệu bài đăng không? Tôi không muốn sử dụng GET vì nó không thể gửi nhiều thông tin, mặc dù nó có thể không phải là một vấn đề với một hình thức yêu cầu đơn giản.

Đây là tôi .htaccess cho chuyển hướng đến index.php

# serve files and dirs if they exist please, otherwise send to index 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule . index.php 

Trả lời

56

Hãy thử điều này:

# redirect mail posting to index 
    RewriteRule send-mail index.php?send-mail [NC,P] 

"P" hành vi như "L" ở chỗ nó dừng quy tắc xử lý nhưng nó cũng nói với các mô-đun yêu cầu phải được chuyển tới mô-đun proxy còn nguyên vẹn (nghĩa là dữ liệu POST được giữ nguyên).

+14

Lưu ý rằng bạn cần phải kích hoạt module proxy, và proxy_http_module trong các tập tin cấu hình để làm việc này. Ngoài ra, bạn có thể cần đặt đường dẫn tuyệt đối cho quy tắc ghi đè. Tức là, trong ví dụ trên, bạn sẽ sử dụng 'RewriteRule send-mail /path/to/index/index.php?send-mail [NC, P]' (hoặc ít nhất là một '/' trước chỉ mục) – Marius

+0

Tuyệt vời đã giúp tôi cảm ơn bạn! – Petrogad

+1

Nếu bạn muốn giữ nguyên tiêu đề Máy chủ lưu trữ, bạn cũng sẽ muốn bật 'ProxyPreserveHost On' trong cấu hình apache. –

1

Miễn là bạn chỉ sử dụng viết lại nội bộ, không phải là chuyển hướng HTTP, bạn không nên mất dữ liệu POST. Dưới đây là các quy tắc tôi sử dụng trên trang web của tôi:

RewriteRule ^(.*)$ index.php/$1 [L] 

Hãy thử sử dụng phần mở rộng HTTPLiveHeaders cho Firefox (hoặc một cái gì đó tương tự) và theo dõi toàn bộ yêu cầu trang. Đảm bảo bạn không nhận được chuyển hướng HTTP. Nếu bạn nhận được phản hồi HTTP/1.1 3xxVị trí: http://address tiêu đề, đó là vấn đề. Quy tắc viết lại của bạn mà bạn đã đăng không nên gây ra điều đó. Nếu bạn đang bị chuyển hướng, có thể có lỗi trong mã PHP của bạn hoặc quy tắc viết lại khác đang được áp dụng.

+0

Không, tôi nhận được 200 OK: S – alex

+0

có vẻ như trình duyệt sẽ sử dụng 'GET' cho yêu cầu thứ hai sau khi được chuyển hướng ... –

+0

Không có yêu cầu thứ hai nào có viết lại. Chỉ một chuyển hướng (tiêu đề vị trí và phản hồi 3xx) có yêu cầu thứ hai. – mcrumley

7

Bạn có thể chỉ cần chuyển hướng đến index.php và sau đó trong tập lệnh đó, truy cập $_SERVER['REQUEST_URI'] để xem yêu cầu ban đầu, với "gửi thư" nguyên vẹn.

Nhân tiện, "không thể gửi nhiều thông tin" không phải là lý do để sử dụng POST. Lý do sử dụng POST là yêu cầu sẽ sửa đổi dữ liệu trên trang web của bạn, thay vì chỉ truy xuất dữ liệu.

Giả sử bạn đặt siêu liên kết trên trang của bạn với yêu cầu GET như "/delete_user?id=1234" và sau đó một số công cụ tìm kiếm vô tình theo liên kết vì nó lập chỉ mục trang web của bạn. Đó là lý do tại sao các yêu cầu GET không tốt cho các yêu cầu sửa đổi dữ liệu.

+3

Có một hạn chế nhỏ trong đó, một khi bạn nhấn một số giới hạn tùy ý (tôi nghĩ rằng 1024 ký tự của nó), dữ liệu theo sau nó bị tước khỏi yêu cầu. Đặc biệt có vấn đề nếu nó xảy ra là trường nhập của người dùng. –

+3

(NB: Giới hạn là máy chủ * và * trình duyệt cụ thể, RFC nói không bị chặn của nó, nhưng chúng tôi biết tần suất một số công ty đọc điều đó) –

+3

+1 Tôi hiểu rõ hơn một chút vì tôi đã hỏi câu hỏi này và bây giờ hoàn toàn hiểu tất cả sửa đổi dữ liệu phải được POST – alex

0

Tôi muốn chuyển hướng user_login.php sang url thân thiện với seo như/user-login với dữ liệu biểu mẫu bài đăng và điều này đã hiệu quả đối với tôi.

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/user_login\.php [NC] 
RewriteRule^user-login [QSA,R=301] 
RewriteRule ^user-login$ user_login.php [QSA,L] 

Theo quan điểm của tập tin

<form action="<?php $siteurl;?>/user-login" method="post" id="user_login"> 
1

Để tránh sự cố với một số proxy và Apache viết lại, vượt qua trong POST dữ liệu hoặc thiết lập các tiêu đề Content-Length: 0 cho các yêu cầu với một cơ thể trống rỗng.

Gần đây, tôi đã gặp sự cố với Apache khi chuyển yêu cầu của tôi sang số GET khi thực hiện POST với thân trống. Vì vậy, thay vì điều này:

curl -X POST https://example.com/api/user/123456789 

vượt qua Content-Length tiêu đề:

curl -X POST https://example.com/api/user/123456789 -H 'Content-Length: 0' 

hoặc vượt qua một cái gì đó trong cơ thể:

curl -X POST https://example.com/api/user/123456789 -d '' 
Các vấn đề liên quan