2008-12-11 12 views
46

Tengo un sitio web donde todas las solicitudes se redireccionan en silencio (a través de .htaccess) a index.php y PHP se utiliza para mostrar la página correcta (mediante el análisis del REQUEST_URI).¿Es posible redirigir los datos de la publicación?

Me preguntaba si es posible enviar datos POST a una dirección falsa también?

Tengo actualmente mi forma así ...

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

Y mi regla es .htaccess ...

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

Mis index.phpisset($_GET['send-mail']) cheques que funciona muy bien.

Esto sin embargo parece dejar todos los datos POST que se le deben enviar.

¿Hay alguna manera de conservar los datos de la publicación? No quiero usar GET porque no puede enviar tanta información, aunque podría no ser un problema con un formulario de consulta simple.

Aquí es mi .htaccess para redireccionar a index.php

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

Respuesta

56

Prueba esto:

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

"P" actúa como "L" en la que se detiene reglas de procesamiento, sino que también le indica al módulo que la solicitud debe transmitirse intacta al módulo proxy (es decir, se conservan los datos POST).

+14

Tenga en cuenta que necesita habilitar el módulo proxy y el proxy_http_module en los archivos de configuración para que esto funcione. Además, es posible que deba establecer la ruta absoluta a la regla de reescritura. Es decir, en el ejemplo anterior, usaría 'RewriteRule send-mail /path/to/index/index.php?send-mail [NC, P]' (o al menos un '/' antes del índice) – Marius

+0

Excelente me ayudó a agradecerte! – Petrogad

+1

Si desea conservar el encabezado del host, también querrá habilitar 'ProxyPreserveHost On' en la configuración de apache. –

1

Siempre que solo utilice una reescritura interna, no una redirección HTTP, no debe perder los datos POST. Esta es la regla que uso en mi sitio:

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

Trate de usar la extensión para Firefox HTTPLiveHeaders (o algo similar) y realizar un seguimiento de toda la solicitud de página. Asegúrese de no obtener un redireccionamiento HTTP. Si obtiene una respuesta HTTP HTTP/1.1 3xx y Ubicación: http://address encabezado, ese es el problema. Su regla de reescritura que ha publicado no debe hacer que eso suceda. Si lo redireccionan, es probable que haya un error en su código PHP u otra regla de reescritura que se esté aplicando.

+0

No, estoy recibiendo 200 OK: S – alex

+0

parece que el navegador usará 'GET' para la segunda solicitud después de ser redirigido ... –

+0

No hay una segunda solicitud con una reescritura. Solo una redirección (encabezado de ubicación y respuesta 3xx) tiene una segunda solicitud. – mcrumley

7

Debería poder simplemente redirigir a index.php, y luego en esa secuencia de comandos, acceder al $_SERVER['REQUEST_URI'] para ver la solicitud original, con "envío de correo" intacto.

Por cierto, "no se puede enviar tanta información" no es el motivo para usar POST. La razón para usar POST es que la solicitud modificará los datos en su sitio, en lugar de simplemente recuperar datos.

Supongamos que pone un hipervínculo en su página con una solicitud GET como "/delete_user?id=1234", y luego algún motor de búsqueda sigue inocentemente el enlace mientras indexa su sitio. Es por eso que las solicitudes GET no son buenas para solicitudes que modifican datos.

+3

Hay una pequeña limitación en eso, una vez que tocas un límite arbitrario (creo que son 1024 caracteres), los datos que siguen se eliminan de la solicitud. Especialmente problemático si resulta ser un campo de entrada de usuario. –

+3

(NB: El límite es el servidor * y * específico del navegador, RFC dice que no tiene límites, pero sabemos con qué frecuencia algunas empresas lo leen) –

+3

+1 Estoy un poco más informado ya que hice esta pregunta y ahora entiendo completamente todas las modificaciones los datos deben ser POST – alex

0

Quiero redirigir user_login.php a seo url como/login de usuario con datos de formulario de publicación y esto funcionó para mí.

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] 

En archivo de vista

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

para evitar problemas con algunos servidores proxy y reescribe, pase Apache en POST de datos o configurar la cabecera Content-Length: 0 para solicitudes con un cuerpo vacío.

Recientemente tuve problemas con Apache al convertir mi solicitud a GET al hacer un POST con un cuerpo vacío. Así, en lugar de esto:

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

pasar la cabecera Content-Length:

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

o pasar algo en el cuerpo:

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