Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
J'utilise les règle de redirection du quickstart officiel
# 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
$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
Je suis pas un expert en mode rewrite, mais dans la règle "officielle", on a :
RewriteRule ^.*$ index.php [NC,L]
et non pas
RewriteRule ^.*$ /index.php [NC,L]
Le / supplémentaire est peut-être la cause de ton problème.
Hors ligne
OsoPardo a écrit:
pourquoi la dernière semble tester /index.php
Elle ne teste pas '/index.php', mais réécrit index.php
Hors ligne
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
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 :
//$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 :
// 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:
$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 :
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 :
$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
Pages: 1