2011-05-03 9 views
9

Problema:¿REQUEST_URI no se reemplaza al utilizar APACHE RewriteRule?

Am usando Kohana/PHP para desarrollar un sitio web alojado por otras empresas. Obtengo que el cliente ingrese una entrada CNAME en su servidor DNS para señalar mi dominio. P.ej. http://invites.somecompany.com apunta a http://www.mydomain.com.

Por lo tanto, la % {} HTTP_HOST entrada en mi servidor Apache es 'invites.somecompany.com'

quiero reescribir http://invites.somecompany.com/invite a http://www.mydomain.com/invites/invite

Aunque Apache parece estar haciendo eso, $ _SERVER ['REQUEST_URI'] sigue siendo "/". El problema es que Kohana usa $ _SERVER ['REQUEST_URI'] para enrutar la solicitud al código del controlador apropiado. En este caso, lo enruta al controlador de índice base, en lugar del controlador 'invita a'.

Datos:

las directivas de Apache mod_rewrite estoy usando (en el archivo .htaccess): -

RewriteCond %{HTTP_HOST} !^www.mydomain.com$ 
RewriteCond %{REQUEST_URI} !.*invites.* 
RewriteRule ^(.*)$ invites/$1 

# For Kohana 
RewriteRule .* index.php?kohana_uri=$0 [PT,QSA,L] 

en el index.php, hago:

var_dump($_SERVER); 

y consigo:

'REQUEST_URI' => string '/', 
'QUERY_STRING' => string 'kohana_uri=invites/index.php&kohana_uri=invites/invite' 
'REDIRECT_QUERY_STRING' => string 'kohana_uri=invites/invite' 

¿Entonces el mod_rewrite no modifica el REQUEST_URI?

Necesidad:

'REQUEST_URI' => 'invites/invite', 
'QUERY_STRING' => string 'kohana_uri=invites/invite', 

¿Cómo consigo que?

====================== Editar

de reescritura de entradas de registro: -

strip per-dir prefix: /Users/project/invite -> invite 
applying pattern '^(?:application|modules|system)\b.*' to uri 'invite' 
strip per-dir prefix: /Users/project/invite -> invite 
applying pattern '\.git' to uri 'invite' 
strip per-dir prefix: /Users/project/invite -> invite 
applying pattern '^(.*)$' to uri 'invite' 
rewrite invite -> invites/invite 
add per-dir prefix: invites/invite -> /Users/project/invites/invite 
strip per-dir prefix: /Users/project/invites/invite -> invites/invite 
applying pattern '.*' to uri 'invites/invite' 
rewrite invites/invite -> index.php?kohana_uri=invites/invite 
add per-dir prefix: index.php -> /Users/project/index.php 
strip document_root prefix: /Users/project/index.php -> /index.php 
internal redirect with /index.php [INTERNAL REDIRECT] 
strip per-dir prefix: /Users/project/index.php -> index.php 
applying pattern '^(?:application|modules|system)\b.*' to uri 'index.php' 
strip per-dir prefix: /Users/project/index.php -> index.php 
applying pattern '\.git' to uri 'index.php' 
strip per-dir prefix: /Users/project/index.php -> index.php 
applying pattern '^(.*)$' to uri 'index.php' 
rewrite index.php -> invites/index.php 
add per-dir prefix: invites/index.php -> /Users/project/invites/index.php 
strip per-dir prefix: /Users/project/invites/index.php -> invites/index.php 
applying pattern '.*' to uri 'invites/index.php' 
rewrite invites/index.php -> index.php?kohana_uri=invites/index.php 
add per-dir prefix: index.php -> /Users/project/index.php 
initial URL equal rewritten URL: /Users/project/index.php [IGNORING REWRITE] 
+0

Eso es cómo funciona el mod_rewrite. – zerkms

+0

hmmmmmmmmmmmmmm – Ajoy

Respuesta

-1

eliminado mi respuesta anterior, ya que estaba completamente equivocado. Gracias por el enlace de documentación, aprendí algo nuevo.

quitar la bandera QSA:

# For Kohana 
RewriteRule .* index.php?kohana_uri=$0 [PT,L] 

Per the Docs:

'qsappend | QSA' (cadena de consulta de datos anexados) Esta bandera hace que el motor de reescritura de anexar una parte cadena de consulta de la cadena de sustitución a la cadena existente , en lugar de reemplazarla. Use esto cuando desee agregar más datos a la cadena de consulta a través de una regla de reescritura.

Debería haber notado que la primera vez.

+0

no es cierto. verifique http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html#RewriteRule "Las referencias anteriores son $ N (N = 0..9) identificadores que serán reemplazados por los contenidos del grupo Nth de el Patrón emparejado ". – Ajoy

+0

No discutiré con la documentación, pero nunca * he visto * $ 0 usado. Además, estás haciendo exactamente lo que dije para hacer en tu regla anterior. ¿Por qué la inconsistencia? – bradym

+0

he usado $ 0 antes y funciona (es lo mismo que en preg_match). La incoherencia es mala, pero incluso si la hago consistente (usando $ 0 en todo), los resultados siguen siendo los mismos. – Ajoy

1

1.) ¿Funciona este enlace si lo llamas manualmente? http://www.mydomain.com/invites/invite

2.) RewriteCond %{HTTP_HOST} !^www.mydomain.com$ necesita ser escapado como RewriteCond %{HTTP_HOST} !^www\.mydomain\.com$

3.) RewriteRule .* index.php?kohana_uri=$0 [PT,QSA,L] es un bucle infinito como index.php se ajusta a la expresión regular .*, también.

4.) Necesita la marca R para redirigir al usuario a invite/RewriteRule ^(.*)$ invites/$1 [R=301]. El %{REQUEST_URI} es el mismo uri que en la barra de direcciones del navegador.

5.) Si no desea redirigir al visitante, puede "piratear" el sistema kohana y establecer $_SERVER['REQUEST_URI'] = $_GET['myURI']; en la primera línea del index.php, si esta fuera la única opción para ejecutarlo. El myURI se puede completar a través de mod_rewrite como lo desee.

+0

Gracias @mgutt. 5) es lo que terminé haciendo. – Ajoy

+0

Otro detalle interesante que aprendí: si tiene reglas de reescritura en el archivo .htaccess, se ejecutan dos veces. Una alternativa es agregar las reglas de reescritura en el archivo httpd.conf, pero sigo recibiendo errores de '400 solicitudes incorrectas'. – Ajoy

0

Debido a la forma en que funciona mod_rewrite, no puede tenerlo en $_SERVER['REQUEST_URI'] inmediatamente. Si estás dispuesto a modificar $_SERVER (que a veces se considera una mala idea), ¿qué tal algo como esto:

$_SERVER['REQUEST_URI'] = $_GET['kohana_uri']; 
$_SERVER['QUERY_STRING'] = $_SERVER['REDIRECT_QUERY_STRING']; 
Cuestiones relacionadas