Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 01-04-2009 16:06:53

OsoPardo
Membre
Date d'inscription: 16-09-2008
Messages: 32

[Résolu] Problème avec les url contenant 'index.php'

Bonjour,

J'utilise les règle de redirection du quickstart officiel

Code:

# public/.htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ /index.php [NC,L]

et je vient de me rendre compte de deux problèmes :

Si j'ai un paramètre dans l'URL ayant pour valeur 'index.php', quel que soit le contrôleur et l'action demandé à travers l'URL c'est toujours le contrôleur Index et son action index qui sont  appelé, sans aucune redirection.

Par exemple si j'entre l'URL http://www.monsite.com/ctrl/action?test=index.php
j'ai le rendu de l'URL http://www.monsite.com/index.php (mais avec toujours la première URL restant dans la barre d'adresse et sans que Firebuf m'indique la moindre redirection)

Comment je sais pour le /index.php ? Parce que c'est mon deuxième problème, si j'appelle l'URL http://www.monsite.com/index.php

Code:

$this->_request->getBaseUrl()

me renvoi cette URL complète et j'essai donc ensuite de récupérer des css, script, images & co à l'URL http://www.monsite.com/index.php/images/... ce qui ne passe pas...

Le second problème peut se gérer facilement mais pour le premier je ne comprend pas vraiment le fonctionnement des règles, par exemple pourquoi la dernière semble tester /index.php mais que '?test=index.php' pose quand même un problème...
Est-ce que mon problème vient vraiment des règles de réécriture des URL comme je le pense ou de tout autre chose ?

Je précise au passage que je n'ai pas de soucis si je remplacer index.php par index2.php dans les URL.

Et si vous vous demandez comment je me suis retrouvé avec un index.php dans les paramètres de l'URL c'est lors d'un échange avec un serveur PHPMyID (serveur OpenID installer un tiers), il me renvoi une URL terminée par 'index.php' en valeur du paramètre openid.identity -> mauvaise action rendue -> impossible de se logger

Dernière modification par OsoPardo (06-04-2009 15:01:57)

Hors ligne

 

#2 04-04-2009 19:51:24

mdelanno
Membre
Lieu: Nord
Date d'inscription: 26-08-2007
Messages: 90
Site web

Re: [Résolu] Problème avec les url contenant 'index.php'

Je suis pas un expert en mode rewrite, mais dans la règle "officielle", on a :

Code:

RewriteRule ^.*$ index.php [NC,L]

et non pas

Code:

RewriteRule ^.*$ /index.php [NC,L]

Le / supplémentaire est peut-être la cause de ton problème.

Hors ligne

 

#3 04-04-2009 19:56:44

mdelanno
Membre
Lieu: Nord
Date d'inscription: 26-08-2007
Messages: 90
Site web

Re: [Résolu] Problème avec les url contenant 'index.php'

OsoPardo a écrit:

pourquoi la dernière semble tester /index.php

Elle ne teste pas '/index.php', mais réécrit index.php

Hors ligne

 

#4 06-04-2009 11:12:33

OsoPardo
Membre
Date d'inscription: 16-09-2008
Messages: 32

Re: [Résolu] Problème avec les url contenant 'index.php'

Le / ne change rien à mon problème mais merci pour ta deuxième remarque, effectivement les règles de réécriture d'URL n'y sont absolument pour rien, j'ai vérifié avec RewriteLog à 9, il n'y a aucune différence de traitement entre une URL contenant un paramètre index.php et une URL n'en contenant pas.

J'essaierais d'aller me plonger dans le code de Zend ce soir pour identifier précisément la cause du problème mais ça ressemble fortement à un bug, non ?

Hors ligne

 

#5 06-04-2009 15:01:15

OsoPardo
Membre
Date d'inscription: 16-09-2008
Messages: 32

Re: [Résolu] Problème avec les url contenant 'index.php'

Le problème vient de la méthode setBaseUrl de la classe Zend_Controller_Request_Http, appelée à l'initialisation du framework, via la méthode dispatch de la classe Zend_Controller_Front.

Sur ma configuration, quand j'appelle l'url 'http://www.monsite.com/user/login/t/index.php', $baseUrl prend d'abord la valeur de $_SERVER['SCRIPT_NAME'], c'est à dire '/index.php', le nom du script actuellement executé et sur lequel toutes les urls dynamiques sont redirigées via les règles de réécriture.

Jusque là la présence ou non de la chaine 'index.php' dans l'url n'a aucune importance, c'est uniquement à l'avant dernier test que le problème se pose :

Code:

//$baseUrl = '/index.php'
//$requestUrl = '/user/login/t/index.php'

if (!strpos($requestUri, basename($baseUrl))) {
    // no match whatsoever; set it blank
    $this->_baseUrl = '';
    return $this;
}

Sans la présence de la chaine 'index.php', $_baseUrl prendrait la bonne valeur (une chaine vide), mais ici le test échoue et on arrive sur le dernier test :

Code:

// If using mod_rewrite or ISAPI_Rewrite strip the script filename
// out of baseUrl. $pos !== 0 makes sure it is not matching a value
// from PATH_INFO or QUERY_STRING
if ((strlen($requestUri) >= strlen($baseUrl))
                && ((false !== ($pos = strpos($requestUri, $baseUrl))) && ($pos !== 0)))
{
    $baseUrl = substr($requestUri, 0, $pos + strlen($baseUrl));
}

Ce test réussi bien mais n'a grosso modo aucun effet sur la valeur de $baseUrl, mais supprimerais tout ce qui se trouverait après 'index.php'.

Reste une dernière affectation, qui n'a pas d'effet non plus:

Code:

$this->_baseUrl = rtrim($baseUrl, '/');

on conserve donc au final '/user/login/t/index.php' comme url de base...

Concernant le dernier test, au moins avec ma configuration, il semble complètement inutile, si on appel l'url 'http://www.monsiteZF.com/index.php', l'url de base est (mal) fixée dès le premier test :

Code:

if (0 === strpos($requestUri, $baseUrl)) {
    // full $baseUrl matches
    $this->_baseUrl = $baseUrl;
    return $this;
}

Il y a déjà eu un raport de bug clôturée en se défaussant du problème :

Matthew Weier O'Phinney a écrit:

Not an issue, really. The ZF MVC is expecting pretty URLs – i.e., no 'index.php' in the URL. If you need it there, and it will be present in all paths in the site, use setBaseUrl() to add it to the request's matching mechanisms.

La solution consiste donc à fixer soit même l'url de base dans le bootstrap :

Code:

$frontController = Zend_Controller_Front::getInstance();
$frontController->setBaseUrl('');
//ou $frontController->setBaseUrl('/');

ce qui, en passant, devrait faire gagner quelques millisecondes.

Dernière modification par OsoPardo (06-05-2009 18:21:49)

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages