2011-03-21 14 views
5

Estoy aprendiendo PHP en mi computadora con IIS7.5 como servidor web y tengo problemas para completar correctamente una redirección 301.PHP en IIS7 - Recepción de la página html "Object Moved" en lugar de redirigir realmente

Los tutoriales y foros todos dicen utilizar el siguiente:

Header('Location: ' . $url, true, 301); 

O

Header('Location: ' . $url); 

En ambos casos, en lugar de realmente redirigir, el navegador (Chrome y Firefox) muestra este:

Object Moved 

This document may be found here 

Utilizando la barra de herramientas del desarrollador web FireFox, recuperé los encabezados de página, que fueron:

Content-Type: text/html; charset=UTF-8 
Server: Microsoft-IIS/7.5 
X-Powered-By: PHP/5.3.5, ASP.NET 
Date: Mon, 21 Mar 2011 18:47:35 GMT 
Content-Length: 123 

301 Moved Permanently 

¿Por qué la página no está redireccionando? Mostrar esa página es algo redundante y molesto para los usuarios.

Respuesta

3

Me di cuenta. El encabezado de Ubicación debe ser una ruta absoluta para redirigir automáticamente. Si es una ruta relativa, no redirige.

+0

En realidad, es su navegador en lugar de PHP o la configuración de su servidor; el requisito de una URL completa es parte de HTTP/1.1, pero algunos clientes seguirán un URI. –

+0

Observé el mismo resultado en FireFox 3.6 y Chrome 10. IE9 no hizo nada, solo mostró un error de página. –

3

Tuve un problema similar, pero el camino ya era absoluto. Lo resolví enviando específicamente un encabezado 301 antes de la ubicación. Se supone que PHP detecta los redireccionamientos y lo hace de forma automática pero no funcionaba.

header("HTTP/1.1 301 Moved Permanently"); 
header("location:http://www.mysite.com/mypage.php"); 
2

Tuve este problema al usar PHP en IIS7 usando la URL absoluta. Me molestó por un tiempo. Asegúrese de poner exit(); después de su encabezado ('Ubicación: https://domain.tld/resource'); el encabezado no detiene la ejecución y, de lo contrario, la función regresará a algún lugar con resultados inesperados.

0

Descubrí un truco fácil para arreglar esto. Use una regla de Redirección de salida para configurar el encabezado de longitud de contenido en las respuestas de redireccionamiento a 0. Los navegadores truncarán automáticamente el cuerpo de respuesta enviado basándose en el encabezado de longitud de contenido.

Aquí es mi regla de redirección:

<rewrite> 
    <outboundRules> 
     <rule name="Remove Content from Redirect Requests" preCondition="Is30xStatus" enabled="true" patternSyntax="Wildcard"> 
      <match serverVariable="RESPONSE_CONTENT_LENGTH" pattern="*" /> 
      <action type="Rewrite" value="0" /> 
     </rule> 
     <preConditions> 
      <preCondition name="Is30xStatus"> 
       <add input="{RESPONSE_STATUS}" pattern="^30[1-8]$" /> 
      </preCondition> 
     </preConditions> 
    </outboundRules> 
</rewrite> 

yo recomendaría usar eso como una referencia para crear una nueva regla de reescritura de salida mediante el Administrador de IIS como archivos Web.config de edición directa puede tener resultados inesperados.

Actualización: Aparentemente hay una directiva de PHP que cambia el formato de los encabezados para ayudar con esto también:

cgi.rfc2616_headers = 1

He probado esto en mi servidor, y esto parece ayudar al problema también.

+0

De acuerdo, puedo ver que esto elimina toda la respuesta. Estoy obteniendo este problema en un estado 201 Creado desde mi API, por lo que necesito mi API para devolver el nuevo objeto y su ID. ¿Hay buenos "hacks" para eliminar ese encabezado html tonto que iis escupe? – roemhildtg

+0

¿Ha intentado establecer una regla de salida condicional? Creo que su comentario probablemente justifique una nueva pregunta con todos los detalles adicionales y la información necesaria para responderla. – Chaoix

+0

Sí, eso es lo que pensé. Publicado aquí: https://forums.iis.net/p/1234223/2126740.aspx?Re+Python+REST+API+Status+201+Create+IIS+Adds+HTML – roemhildtg

Cuestiones relacionadas