簡體   English   中英

是否可以重定向帖子數據?

[英]Is it possible to redirect post data?

我有一個網站,所有請求都被靜默(通過.htaccess )重定向到index.php ,然后 PHP 用於顯示正確的頁面(通過解析REQUEST_URI )。

我想知道是否也可以將 POST 數據提交到假地址?

我目前的表格是這樣的......

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

我的.htaccess規則是......

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

我的index.php檢查isset($_GET['send-mail'])工作正常。

然而,這似乎丟棄了所有應該發送給它的 POST 數據。

有沒有辦法保留帖子數據? 我不想使用 GET,因為它無法發送盡可能多的信息,盡管它可能不是簡單的查詢表單的問題。

這是我用於重定向到index.php.htaccess

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

嘗試這個:

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

“P”的作用類似於“L”,它停止處理規則,但它也告訴模塊該請求應該原封不動地傳遞給代理模塊(意味着保留 POST 數據)。

您應該能夠簡單地重定向到index.php ,然后在該腳本中,訪問$_SERVER['REQUEST_URI']以查看原始請求,“發送郵件”完好無損。

順便說一句,“不能發送盡可能多的信息”不是使用 POST 的原因。 使用 POST 的原因是該請求將修改您網站上的數據,而不是簡單地檢索數據。

假設您在您的頁面上放置了一個超鏈接,其中包含“ /delete_user?id=1234 ”之類的 GET 請求,然后某個搜索引擎在為您的網站編制索引時無辜地跟蹤該鏈接。 這就是為什么 GET 請求不適用於修改數據的請求。

我發現最可靠的方法是使用307狀態碼。

RewriteRule send-mail index.php?send-mail [R=307,L]

狀態碼 307 表示應使用相同的 HTTP 方法和數據重復請求。 因此,如果您使用此狀態碼,您的POST請求將與其數據一起重復。

您可以檢測請求是否為POST請求,以防您需要支持非POST請求的標准301重定向。

# POST requests.
RewriteCond %{REQUEST_METHOD} POST
RewriteRule send-mail index.php?send-mail [R=307,L]

# Standard GET requests.
RewriteRule send-mail index.php?send-mail [R=301,L]

為避免某些代理和 Apache 重寫出現問題,請傳入POST數據或為具有空正文的請求設置Content-Length: 0標頭。

我最近在使用空正文進行POST時遇到了 Apache 將我的請求轉換為GET的問題。 所以,而不是這個:

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

傳遞Content-Length標頭:

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

或在體內傳遞一些東西:

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

我想將 user_login.php 重定向到 seo 友好的 url,如 /user-login 和發布表單數據,這對我有用。

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]

在視圖文件中

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

只要您只使用內部重寫,而不是 HTTP 重定向,就不應丟失 POST 數據。 這是我在我的網站上使用的規則:

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

嘗試使用 Firefox 的 HTTPLiveHeaders 擴展(或類似的東西)並跟蹤整個頁面請求。 確保您沒有收到 HTTP 重定向。 如果您收到HTTP/1.1 3xx響應和Location: http://address標頭,那就是問題所在。 您發布的重寫規則不應導致這種情況發生。 如果您被重定向,則可能是您的 PHP 代碼中存在錯誤或正在應用另一個重寫規則。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM