Question

En Java, je peux écrire un JSP vraiment basique index.jsp comme ceci:

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

Cela a pour effet qu'un utilisateur qui demande home.action (ou uniquement le répertoire contenant en supposant que <=> est un document par défaut pour le répertoire) verra <=> sans redirection de navigateur, c'est-à-dire le bouton [forward] (< a href = "http://java.sun.com/javaee/5/docs/api/javax/servlet/RequestDispatcher.html#forward(javax.servlet.ServletRequest,%20javax.servlet.ServletResponse))" rel = " nofollow noreferrer "> http://java.sun.com/javaee/5/docs/api/javax/servlet/RequestDispatcher.html#forward (javax.servlet.ServletRequest,% 20javax.servlet.ServletResponse)) se passe côté serveur.

Puis-je faire quelque chose de similaire avec PHP? Je pense qu’il est possible de configurer Apache pour gérer ce cas, mais comme je n’ai peut-être pas accès à la configuration appropriée d’Apache, je serais intéressé par une solution reposant uniquement sur PHP.

Était-ce utile?

La solution

Si vous êtes préoccupé par la disponibilité des CURL, vous pouvez utiliser file_get_contents() et les flux. Configurer une fonction comme:

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;
}

Ceci configure simplement un GET, mais vous pouvez également publier un post avec <=>.

Autres conseils

Le truc avec Request.Forward est qu’il vous donne une nouvelle requête propre à l’action que vous voulez. Par conséquent, vous n'avez pas de résidu dans la requête en cours et, par exemple, aucun problème avec les scripts qui s'appuient sur l'équation java de $ _SERVER ['REQUEST_URI'] étant quelque chose.

Vous pouvez simplement déposer une classe CURL et écrire une fonction simple pour le faire:

<?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);
        }
    }

}

Il suffit de sauvegarder ceci dans class.CURLHandler.php et vous pouvez le faire:

bien sûr, utiliser $ _REQUEST n’est pas vraiment sûr (vous devriez vérifier $ _SERVER ['REQUEST_METHOD']) mais vous obtenez le point.

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

Bien sûr, CURL n'est pas installé partout mais nous avons émulateurs PHP natifs pour cela.

De plus, cela vous donne encore plus de flexibilité que Request.Forward car vous pouvez également capturer et post-traiter la sortie.

Je pense qu'une des méthodes analogues les plus proches serait d'utiliser le virtual ( ) lors de l'exécution de php en tant que module apache.

  

virtual () est une fonction spécifique à Apache similaire à    dans   mod_include. Il effectue un Apache   sous-requête.

Si vous utilisez un MVC comme le prévoit Zend Framework, vous pouvez modifier l'action du contrôleur ou même passer d'une action à l'autre. La méthode est _forward comme décrite ici .

Essayez ceci.

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

sur la page incluse, la $vars variable fonctionnera en tant qu'attribut de demande Java

Concepts Rediriger et Transférer comme en Java peut également être réalisé en PHP.

Redirect :: header("Location: redirect.php"); - (URL dans les modifications de la barre d'adresse)

Transférer :: include forward.php ; - (URL non modifiée dans la barre d'adresse)

C'est gérable avec cet & ampli; autres logiques de programmation

Vous pouvez utiliser comme:

header ("Location: /path/");
exit;

La sortie est nécessaire au cas où une sortie HTML aurait été envoyée auparavant, l'en-tête () ne fonctionnerait pas. Vous devez donc envoyer un nouvel en-tête avant toute sortie vers le navigateur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top