2012-05-01 18 views
6

Esta pregunta está relacionada de alguna manera con mi previous question. El truco de usar $_SERVER['REDIRECT_QUERY_STRING'] parece funcionar solo para las variables $_GET.

Bueno, tengo un archivo index.php que maneja todos los 404 redirects.

Si un usuario solicita una página, que no lo existe, por ejemplo, apple.php?item=23, a continuación, utilizando $_SERVER['REDIRECT_QUERY_STRING'] puedo conseguir el $_GET variables item=23, pero si la variable no es $_GET pero $_POST continuación $_SERVER['REDIRECT_QUERY_STRING'] no funciona.

¿Cómo puedo obtener $_POST variable cuando vuelvo a dirigir a index.php utilizando la siguiente configuración de

ErrorDocument 404 /index.php

+1

No es un "truco", es simplemente una solución terrible. ¿Por qué no usar 'mod_rewrite'? PD: no, después de la redirección 404 ya ha perdido los datos de la publicación y no puede obtenerlo – zerkms

+0

no estoy seguro, pero creo que perderá todos los datos POST al redirigir. ¿Para qué lo necesitas? tal vez haya alguna forma diferente – miro

+0

Tenga en cuenta que no existe el '404 redireccionamiento'. Los códigos de respuesta 4xx indican un error del cliente (404 indica que el recurso solicitado por el cliente no existe en el servidor), los códigos 3xx son para la redirección.Si desea obligar a un cliente a volver a enviar y una solicitud POST idéntica a un nuevo URI, debe usar un código de estado 307. Pero sospecho que lo que realmente necesita usar aquí es 'RewriteCond% {REQUEST_FILENAME}! -f' y' RewriteCond% {REQUEST_FILENAME}! -d' para reescribir las solicitudes de archivos que no existen para un script específico. – DaveRandom

Respuesta

7

Comprobar respuesta aquí: http://www.brainonfire.net/blog/apache-pitfall-errordocument-post/

que resolvió mi problema con esto.


o poner esto en su archivo .htaccess:

 

    RewriteEngine On 
    RewriteBase/


    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule . /yourErrorDocument.php [L] 

+0

No funcioné - me faltan $ _SERVER ['REQUEST_METHOD'] y $ _POST (php 5.4.12) –

5

con la siguiente directiva .htaccess:

ErrorDocument 404 /index.php 

el servidor web apache hace un redireccionamiento interno a la nueva ubicación. Medios internos, el cliente (navegador) no cambiará la URL en su barra de direcciones porque esa redirección no se comunica al navegador.

Como se trata de una redirección, la solicitud POST se convierte en una solicitud GET.

se puede ver esto mirando en las siguientes dos $_SERVER variables:

$_SERVER['REDIRECT_REQUEST_METHOD'] # POST 
$_SERVER['REQUEST_METHOD'] # GET 

Así que en resumen, no se puede utilizar el ErrorDocument directive hacer la reescritura de URL para las solicitudes HTTP POST.

Debe usar el mod_rewrite module para esto o crear su propio controlador de apache.

+0

Gracias, i av resolvió el problema con la ayuda de la idea de DaveRandom :) Anways, gracias a ti también por ayudar :) –

+0

Esta es la forma más sencilla de hacerlo si no necesitas obtener los datos de la publicación. –

+2

@JackFranzen: Ah, también está la Directiva [** 'FallbackResource' **] (https://httpd.apache.org/docs/current/mod/mod_dir.html#fallbackresource) que no tiene el POST limitaciones como se discute en esta respuesta. Ver también http://stackoverflow.com/a/8196767/367456 y http://stackoverflow.com/a/7968869/367456 donde lo cubrí antes. – hakre

2

usar la directiva FallbackResource en lugar de la ErrorDocument directiva de Apache: se hace el truco FallbackResource on Apache website

Ejemplo:

FallbackResource /404.php 
+0

Esta es la solución que funcionó para lo que necesitaba. Gracias por proporcionarlo Una nota importante para quienes implementan esta solución: deberá especificar el archivo real por nombre. Por ejemplo, en mi proyecto tenía previamente "ErrorDocument 403/router /" como mi directiva sin especificar "index.php" al final. Cuando probé "FallbackResource/router /" falló hasta que lo cambié a "FallbackResource /router/index.php". –

+0

Consulte también esta publicación, que le ahorrará una hora de tiempo intentando depurar por qué no funciona para el extremo raíz de "/": https://serverfault.com/questions/512735/fallbackresource-directive-works- for-any-uri-except –

Cuestiones relacionadas