Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 06-06-2012 11:03:45

Kunai
Nouveau membre
Lieu: Var
Date d'inscription: 17-02-2012
Messages: 6

Traiter /index.php comme toute autre requête

Bonjour,

Voici le problème que je rencontre actuellement.
Avec une configuration classique (et les réécritures qui vont bien)  sur un hébergement mutualisé utilisant pour webserver Apache2, on peut accéder à un controller de la manière suivante :

http://domain.tld/controller

mais on peut également y accéder via :

http://domain.tld/index.php/controller

Je ne souhaite pas particulièrement traiter ce genre de problème via des règles de réécriture différentes au sein du fichier .htaccess mais j'aimerais plutôt que ces cas soient gérés comme des cas classiques par le routeur. Ici, le routeur cherchant alors un controller index.php, qu'il existe ou non.

Je n'arrive pas à comprendre les raisons du fonctionnement actuel, et je suppose que le problème est situé autour des classes Zend_Controller_Request_Http ou Zend_Controller_Dispatcher_Standard, mais je me demande s'il est possible via une configuration ou un plugin quelconque de corriger ce comportement que je ne souhaite vraiment pas.

En passant, avoir un fonctionnement tel par défaut augmente les risques de duplicate content. Pour moi, et jusqu'à preuve du contraire, il s'agit dès lors plus d'un bug que d'une possibilité.

Hors ligne

 

#2 07-06-2012 14:20:43

Kunai
Nouveau membre
Lieu: Var
Date d'inscription: 17-02-2012
Messages: 6

Re: Traiter /index.php comme toute autre requête

Pour situer plus précisément ce que je considère comme étonnant :

Zend/Controller/Request/Http:612

Code:

[lang=php]
    /**
     * Set the PATH_INFO string
     *
     * @param string|null $pathInfo
     * @return Zend_Controller_Request_Http
     */
    public function setPathInfo($pathInfo = null)
    {
        if ($pathInfo === null) {
            $baseUrl = $this->getBaseUrl(); // this actually calls setBaseUrl() & setRequestUri()
            $baseUrlRaw = $this->getBaseUrl(false);
            $baseUrlEncoded = urlencode($baseUrlRaw);
        
            if (null === ($requestUri = $this->getRequestUri())) {
                return $this;
            }
        
            // Remove the query string from REQUEST_URI
            if ($pos = strpos($requestUri, '?')) {
                $requestUri = substr($requestUri, 0, $pos);
            }
            
            if (!empty($baseUrl) || !empty($baseUrlRaw)) {
                if (strpos($requestUri, $baseUrl) === 0) {
                    $pathInfo = substr($requestUri, strlen($baseUrl));
                } elseif (strpos($requestUri, $baseUrlRaw) === 0) {
                    $pathInfo = substr($requestUri, strlen($baseUrlRaw));
                } elseif (strpos($requestUri, $baseUrlEncoded) === 0) {
                    $pathInfo = substr($requestUri, strlen($baseUrlEncoded));
                } else {
                    $pathInfo = $requestUri;
                }
            } else {
                $pathInfo = $requestUri;
            }
        
        }

        $this->_pathInfo = (string) $pathInfo;
        return $this;
    }

Ici, $baseUrl vaut peu ou prou $_SERVER['SCRIPT_FILENAME'], impliquant donc qu'on supprime cette partie si elle est présente dans $_SERVER['REQUEST_URI']. Je me demande réellement s'il y a un intérêt quelconque à cela, et si intérêt il y a pour certains cas de figure, je trouve étonnant d'en faire une généralité.

Hors ligne

 

#3 07-06-2012 14:31:47

Kunai
Nouveau membre
Lieu: Var
Date d'inscription: 17-02-2012
Messages: 6

Re: Traiter /index.php comme toute autre requête

Auto-réponse à nouveau, et je pense que celle-ci peut potentiellement intéresser d'autres personnes, si l'on veut se débarrasser de l'accès via index.php dans une configuration classique de déploiement ZF, il "suffit" de définir au préalable la baseUrl afin que Zend_Controller_Request_Http ne la détermine automatiquement. Pour définir la baseUrl, une méthode consiste à ajouter la ligne suivante dans le fichier ini de votre application :

Code:

resources.frontController.baseUrl = "/"

C'est tout simple, mais pas forcément évident au premier abord wink

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