2009-05-23 7 views
3

Dans le cadre Zend, en utilisant le MVC, si un utilisateur surfe explicitement à http://base/url/index.php au lieu de seulement http://base/url, le système pense que l'URL de base réelle est http://base/url/index.php/ et selon cela calcule tout les URL dans le système. Donc, si j'ai un contrôleur XXX et l'action YYY, le lien sera
http://base/url/index.php/XXX/YYY ce qui est bien sûr erroné.Comment résoudre le cas lorsque les utilisateurs surfent sur index.php

Je résous actuellement en ajoutant une ligne à index.php:

$_SERVER["REQUEST_URI"]=str_replace('index.php','',$_SERVER["REQUEST_URI"]); 

Je me demande s'il y a un moyen intégré dans ZF pour résoudre ce problème.

Répondre

5

Vous pouvez le faire avec ZF en utilisant Zend_Controller_Router_Route_Static (ouf!), Par exemple:

Lisez le manuel lié ci-dessus, il y a quelques très bons exemples à trouver.

$route = new Zend_Controller_Router_Route_Static(
    'index.php', 
    array('controller' => 'index', 'action' => 'index') 
); 
$router->addRoute('index', $route); 

Je ne peux pas dire que je ne suis pas du tout d'accord avec votre approche. Cela dit, d'autres peuvent souligner quelque 5000 inconvénients. Bonne chance avec ça.

2

Eh bien, cela dépend vraiment de la façon dont vous voulez résoudre ce problème. Comme vous le savez, Zend Frameworks est construit sur le modèle de contrôleur frontal, où chaque requête qui ne référence pas explicitement un fichier dans le répertoire/public est redirigée vers index.php. Ainsi, vous pouvez fondamentalement résoudre ce dans plusieurs façons:

  1. Modifier le fichier .htaccess (ou directive de configuration du serveur) pour réécrire la requête à la demande souhaitée.
    • RewriteRule (* index.php)/error/forbidden? req = $ 1 // Réécrire à l'action interdite du contrôleur d'erreur.
    • RewriteRule index.php/index // Réécrire la demande au contrôleur principal et de l'action
  2. Ajouter un itinéraire statique dans votre bootstrapper comme suggéré par karim79.
0

Je ne pense pas que vous devriez utiliser une route pour faire cela.

C'est un problème générique qui ne devrait pas être résolu de cette façon.

Vous feriez mieux de le faire dans votre fichier .htaccess, ce qui vous offrira un meilleur moyen de rediriger l'utilisateur vers l'endroit où vous voulez, comme une page d'erreur, ou vers l'index &.

Voici la page de documentation pour la mod_rewrite

0

Je ne l'ai jamais fait face à ce problème en utilisant Zend Framework. juste ne pas lier au fichier index.php. c'est tout. et quand votre donnez à votre adresse de l'application aux utilisateurs, juste leur dire d'aller à http://base/url/

lorsque l'utilisateur entre http://base/url/ sa demande URI est la base/urlet votre fichier .htaccess déroutes la demande à l'index.php, mais la demande estbase/url. vous n'avez pas besoin d'enlever 'index.php' de la requête. parce que ce n'est pas là. Lorsque vous essayez de générer des URL pour des liens et des formulaires et ..., utilisez l'aide intégrée à la vue url() pour générer vos liens.

comme ceci:

// in some view script 
<a href="<?php 
    echo $this->url(array('controller'=>'targetController','action'=>'targetAction')); 
     ?>" >click</a> 

Ne vous inquiétez pas pour le lien. Zend va générer une URL pour vous.

+0

Vous êtes 1000% à droite, le problème est que les utilisateurs, j'ai découvert, ont tendance parfois à ajouter index.php à l'URL. C'est ainsi que j'ai appris à propos de ce problème. –

0

La façon dont je regarde est que si j'ai un site Web alimenté par PHP et un utilisateur accède à http://site/index.aspx alors j'envoyer un 404.

Même si index.php existe en théorie, ce n'est pas un URL valide dans mon application, donc je voudrais envoyer un 404 dans ce cas aussi.

+1

Ne sera-t-il pas plus convivial de le "rediriger" vers la véritable URL? –

2

Utilisez mod_rewrite. Quelque chose comme cela devrait le faire:

RewriteRule ^index.php/(.*)$ /$1 [r=301,L] 
Questions connexes