5

.htacesss

RewriteCond %{REQUEST_URI} ^/api/(.+)$
RewriteRule ^api/(.+)$ /index.php?api=%1 [QSA,L]

ajax URLリクエストの例:'http://hostname.com/api/ext/list.php?query=de'

この形式のURLを次のindex.php?api = {requested_filename}&param1 = value1&param2 =value2..にリダイレクトできるようにしたい。

サイト全体がindex.phpのブートストラッププロセスで処理されるためです。このプロセスには、構成、テンプレートなどをロードするルーティング部分があります。

たとえば、jqueryコードを試してみると、リダイレクト後にPOSTデータが失われます。

$.ajax({
            url: '/api/contact.php',
            type: 'POST',
            data: { 
                email: $("#contactEmail").val(),
                name: $("#contactName").val(),
                message: $("#contactMessage").val()
                                // etc ...
            }
});

httpリダイレクトでデータを保存できないことを読みました。しかし、どのようにしてすべてのフレームワークがそれを回避するのでしょうか?私は多くのコードを記述しましたが、すべてがindex.phpを介してブートストラップされ、.htaccessファイルにはきれいなURLを有効にするための書き換えルールがあります。したがって、たとえばYiiでは、いくつかのPOSTデータを使用してURL「api / uploads / latests.json」を呼び出し、バックエンドのコントローラーがそのデータを受信します。ここで何が欠けていますか?

注:[P] mod_rewriteパラメーターをテストしましたが、このサーバーではmod_proxyが有効になっていないと思います。

4

3 に答える 3

5

リライトとリダイレクトには違いがあります。

Rewriteはapache(および他のサーバー)モジュールであり、一連のcond / rulesに従って、要求されたURLをサーバー上のファイルにマップします(例:ブートストラップはすべてのURLを単一のファイル(通常はindex.php)に再書き込みします。mvcは/ model / controller / view uriを適切なmvcファイルを呼び出すindex.phpにマップします)。

リダイレクトは実際にあなたがいるページを変更します。誰かがページA.phpを要求し、そのページに「探しているものはB.phpにあります」と表示されているため、ブラウザはB.phpに移動します。

URLは変更されないため、書き換えると投稿パラメータが保持されます。書き換えは、要求されているスクリプトを変更するだけですが、ブラウザには、要求されたURLにページがまだ存在しているように見えます。

サーバーがユーザーを別のページに完全にリダイレクトするため、リダイレクトは投稿パラメーターを保持しません。

あなたがやろうとしているように見えるのは、リダイレクトではなく、書き換えです。postパラメータの取得に問題はないはずです。

これを修正するには、postパラメータがないことをindex.phpでどのようにチェックしますか?期待しているコントローラーが呼び出されてもよろしいですか?

于 2012-12-14T21:52:56.833 に答える
3

すべてのPOSTデータはリダイレクト時に失われます。htaccessの書き換え/リダイレクトルールで保存する方法はありません。

クライアント(私が知っているすべての主要なブラウザー)によって受信されたリダイレクト(すべて301、302、303)は、GET要求を行うための新しいURLとして扱われます。リダイレクトのソースがPOSTリクエストであったとしても、ブラウザはこのURLに古い投稿パラメータを自動的に追加しません。

これについて私が見つけた唯一の方法は、コード内で書き直し、POSTパラメーターをGETパラメーターに変換して、新しいURLの最後に貼り付けることです。次に、phpで、ヘッダーの場所の変更(または選択したライブラリが使用するリダイレクト呼び出し)を発行します。

header("Location: http://www.example.com/?my_old_post_args=123"); 
exit;
于 2012-12-14T21:41:57.060 に答える
1

誰もがこの問題を抱えているので私はサムの問題を抱えていますそして私はこのようなものを使います

RewriteRule ^services/MainService/(.*)$ http://193.9.162.91/mobile-feed/mobile.list.news.images.php?original_request=$1 [R=301,L]

これはajax投稿では機能しません。RewriteRuleを次のように変更する必要があります

RewriteRule ^services/MainService/(.*)$ http://193.9.162.91/mobile-feed/mobile.list.news.images.php?original_request=$1 [QSA,L]

この作品と私が持っているphpファイルに

$inputJSON = file_get_contents('php://input');
$input= json_decode( $inputJSON, TRUE ); //convert JSON into array
print_r($input);
于 2016-03-28T10:45:00.437 に答える