Pregunta

En Java puedo escribir un básico de JSP index.jsp así:

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

El efecto de esto es que un usuario que solicita index.jsp (o simplemente el directorio asumiendo index.jsp es un documento predeterminado para el directorio va a ver home.action sin necesidad de un navegador redirigir, es decir,[reenviar](http://java.sun.com/javaee/5/docs/api/javax/servlet/RequestDispatcher.html#forward(javax.servlet.ServletRequest,%20javax.servlet.ServletResponse)) ocurre en el lado del servidor.

Puedo hacer algo similar con PHP?Sospecho que es posible configurar Apache para manejar este caso, pero ya que yo no podría tener acceso a la información de configuración de Apache estaría interesado en una solución que se basa en PHP solo.

¿Fue útil?

Solución

Si usted está preocupado acerca de la CURVATURA de la disponibilidad, a continuación, podría utilizar file_get_contents() y arroyos.La configuración de una función como:

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

Esto sólo establece un GET, pero se puede hacer un post con file_get_contents() así.

Otros consejos

El truco sobre Request.Forward es que le ofrece una solicitud nueva y limpia de la acción que desea. Por lo tanto, no tiene residuos de la solicitud actual y, por ejemplo, no tiene problemas con los scripts que dependen de la ecuación de Java de $ _SERVER ['REQUEST_URI'] como algo.

Podría simplemente colocar una clase CURL y escribir una función simple para hacer esto:

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

}

Simplemente descargue esto en class.CURLHandler.php y puede hacer esto:

por supuesto, usar $ _REQUEST no es realmente seguro (debes marcar $ _SERVER ['REQUEST_METHOD']) pero obtienes el punto.

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

Por supuesto, CURL no está instalado en todas partes pero tenemos emuladores de curl PHP nativos para eso.

Además, esto le brinda aún más flexibilidad que Request.Forward, ya que también puede capturar y procesar la salida.

Creo que uno de los métodos análogos más cercanos sería utilizar virtual ( ) funciona mientras se ejecuta php como un módulo de apache.

  

virtual () es una función específica de Apache que es similar a    en   mod_include. Realiza un Apache   sub-solicitud.

Si usa un MVC como el que proporciona Zend Framework, puede cambiar la acción del controlador o incluso saltar entre las acciones del controlador. El método es _forward como descrito aquí .

Prueba esto.

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

en la página incluida, la variable $vars funcionará como los atributos de solicitud de Java

Los conceptos de redireccionamiento y reenvío, como en Java, también se pueden lograr en PHP.

Redirect :: header("Location: redirect.php"); - (La URL en la barra de direcciones cambia)

Reenviar :: include forward.php ; - (URL sin cambios en la barra de direcciones)

Es manejable con este & amplificador; otras lógicas de programación

Puede usar como:

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

La salida es necesaria solo en caso de que se haya enviado alguna salida HTML antes, el encabezado () no funcionará, por lo que debe enviar un nuevo encabezado antes de cualquier salida al navegador.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top