9

index.jspJavaでは、次のような非常に基本的なJSPを記述できます。

<% request.getRequestDispatcher("/home.action").forward(request, response); %>

これの効果は、要求しているユーザーindex.jsp(またはディレクトリindex.jspのデフォルトドキュメントであると仮定して含まれているディレクトリのみ)がhome.actionブラウザリダイレクトなしで表示されることです。つまり、[forward](http://java.sun.com/javaee/5 /docs/api/javax/servlet/RequestDispatcher.html#forward(javax.servlet.ServletRequest,%20javax.servlet.ServletResponse))はサーバー側で発生します。

PHPで同様のことを行うことはできますか?このケースを処理するようにApacheを構成することは可能だと思いますが、関連するApache構成にアクセスできない可能性があるため、PHPのみに依存するソリューションに興味があります。

4

7 に答える 7

1

これを試して。

function forward($page, $vars = null){
    ob_clean();
    include($page);
    exit;
}

インクルードされたページでは、$vars変数は Java リクエスト属性として機能します

于 2012-03-09T04:11:14.497 に答える
1

Request.Forward の秘訣は、必要なアクションに対してクリーンで新しいリクエストを提供することです。したがって、現在のリクエストからの残留物はありません。たとえば、$_SERVER['REQUEST_URI'] の Java eq が何かに依存しているスクリプトに問題はありません。

CURL クラスにドロップして、これを行う簡単な関数を書くことができます。

<?php 
/**
 * CURLHandler handles simple HTTP GETs and POSTs via Curl 
 * 
 * @author SchizoDuckie
 * @version 1.0
 * @access public
 */
class CURLHandler
{

    /**
     * CURLHandler::Get()
     * 
     * Executes a standard GET request via Curl.
     * Static function, so that you can use: CurlHandler::Get('http://www.google.com');
     * 
     * @param string $url url to get
     * @return string HTML output
     */
    public static function Get($url)
    {
       return self::doRequest('GET', $url);
    }

    /**
     * CURLHandler::Post()
     * 
     * Executes a standard POST request via Curl.
     * Static function, so you can use CurlHandler::Post('http://www.google.com', array('q'=>'belfabriek'));
     * If you want to send a File via post (to e.g. PHP's $_FILES), prefix the value of an item with an @ ! 
     * @param string $url url to post data to
     * @param Array $vars Array with key=>value pairs to post.
     * @return string HTML output
     */
    public static function Post($url, $vars, $auth = false) 
    {
       return self::doRequest('POST', $url, $vars, $auth);
    }

    /**
     * CURLHandler::doRequest()
     * This is what actually does the request
     * <pre>
     * - Create Curl handle with curl_init
     * - Set options like CURLOPT_URL, CURLOPT_RETURNTRANSFER and CURLOPT_HEADER
     * - Set eventual optional options (like CURLOPT_POST and CURLOPT_POSTFIELDS)
     * - Call curl_exec on the interface
     * - Close the connection
     * - Return the result or throw an exception.
     * </pre>
     * @param mixed $method Request Method (Get/ Post)
     * @param mixed $url URI to get or post to
     * @param mixed $vars Array of variables (only mandatory in POST requests)
     * @return string HTML output
     */
    public static function doRequest($method, $url, $vars=array(), $auth = false)
    {
        $curlInterface = curl_init();

        curl_setopt_array ($curlInterface, array( 
            CURLOPT_URL => $url,
            CURLOPT_CONNECTTIMEOUT => 2,
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_FOLLOWLOCATION =>1,
            CURLOPT_HEADER => 0));

        if (strtoupper($method) == 'POST')
        {
            curl_setopt_array($curlInterface, array(
                CURLOPT_POST => 1,
                CURLOPT_POSTFIELDS => http_build_query($vars))
            );  
        }
        if($auth !== false)
        {
              curl_setopt($curlInterface, CURLOPT_USERPWD, $auth['username'] . ":" . $auth['password']);
        }
        $result = curl_exec ($curlInterface);
        curl_close ($curlInterface);

        if($result === NULL)
        {
            throw new Exception('Curl Request Error: '.curl_errno($curlInterface) . " - " . curl_error($curlInterface));
        }
        else
        {
            return($result);
        }
    }

}

これを class.CURLHandler.php にダンプするだけで、次のことができます。

もちろん、$_REQUEST の使用は実際には安全ではありません ($_SERVER['REQUEST_METHOD'] を確認する必要があります) が、要点はわかります。

<?php
include('class.CURLHandler.php');
die CURLHandler::doRequest($_SERVER['REQUEST_METHOD'], 'http://server/myaction', $_REQUEST);
?>

もちろん、CURL はどこにもインストールされているわけではありませんが、そのためのネイティブ PHP カール エミュレーターがあります。

また、これにより、出力をキャッチして後処理することもできるため、Request.Forward よりもさらに柔軟になります。

于 2009-01-11T22:39:05.523 に答える
1

Zend Framework が提供するような MVC を使用すると、コントローラーのアクションを変更したり、コントローラーのアクション間をジャンプしたりすることもできます。ここで説明されているように、メソッドは _forwardです。

于 2009-01-12T00:45:58.217 に答える
1

最も類似した方法の 1 つは、Apache モジュールとして php を実行しているときにvirtual()関数を使用することだと思います。

virtual()は、mod_include に似た Apache 固有の関数です。Apache サブリクエストを実行します。

于 2009-01-11T23:26:48.687 に答える
0

Java のようなリダイレクトとフォワードの概念は、PHP でも実現できます。

Redirect :: header("Location: redirect.php");-- (アドレスバーの URL が変わる)

転送 :: include forward.php ;-- (アドレス バーの URL は変更されません)

これと他のプログラミングロジックで管理可能

于 2014-11-03T22:36:30.773 に答える
0

CURL の可用性が心配な場合はfile_get_contents()、ストリームを使用できます。次のような関数を設定します。

function forward($location, $vars = array()) 
{
    $file ='http://'.$_SERVER['HTTP_HOST']
    .substr($_SERVER['REQUEST_URI'],0,strrpos($_SERVER['REQUEST_URI'], '/')+1)
    .$location;

    if(!empty($vars))
    {
         $file .="?".http_build_query($vars);
    }

    $response = file_get_contents($file);

    echo $response;
}

これは GET を設定するだけですが、投稿file_get_contents()も同様に行うことができます。

于 2009-01-12T08:13:26.987 に答える