如何解决用户浏览index.php时的情况

时间:2009-05-23 13:15:33

标签: php zend-framework zend-framework-mvc

在Zend框架中,使用MVC,如果A用户明确地浏览到http://base/url/index.php而不是http://base/url,系统会认为真正的基本网址为http://base/url/index.php/,并根据该计算所有系统中的URL。

所以,如果我有一个控制器XXX并且操作YYY该链接将是
http://base/url/index.php/XXX/YYY这当然是错的。

我目前正在通过在index.php上添加一行来解决这个问题:

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

我想知道ZF中是否有内置方法来解决这个问题。

6 个答案:

答案 0 :(得分:5)

您可以使用Zend_Controller_Router_Route_Static(p!)来使用ZF执行此操作,例如:

阅读上面链接的手册页,有一些很好的例子可以找到。

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

不能说我完全不同意你的做法。也就是说,其他人可能会指出5000左右的缺点。祝你好运。

答案 1 :(得分:2)

那真的取决于你想要解决这个问题。如您所知,Zend Frameworks构建在前端控制器模式上,其中每个未明确引用/ public目录中文件的请求都被重定向到 index.php 。所以你基本上可以通过多种方式解决这个问题:

  1. 编辑.htaccess文件(或服务器配置指令)以将请求重写为所需的请求:
    • RewriteRule(。* index.php)/ error / forbidden?req = $ 1 //重写为错误控制器的禁止操作。
    • RewriteRule index.php / index //将请求重写为主控制器和操作
  2. 按照karim79的建议在您的引导程序中添加静态路由。

答案 2 :(得分:2)

使用mod_rewrite。这样的事情应该这样做:

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

答案 3 :(得分:0)

我认为你不应该使用路线来做这件事。

这是一种通用问题,不应该通过这种方式解决。

你最好在你的.htaccess中做这件事,这将为你提供更好的和更好的选择。更简单的方法将用户重定向到您想要的位置,例如错误页面或索引。

以下是mod_rewrite

的文档页面

答案 4 :(得分:0)

我从未使用Zend Framework遇到过这个问题。只是不要链接到index.php文件。而已。当您向用户提供申请时,请告诉他们转到http://base/url/

当用户输入http://base/url/时,她的请求URI为 base / url ,而您的.htaccess文件会将请求路由到index.php,但请求 IS 基/ URL 。您不需要从请求中删除'index.php'。因为它不存在。

当您尝试为链接和表单生成URL和...时,请使用内置的url()视图助手来生成链接。像这样:

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

不要担心链接。 Zend将为您生成一个URL。

答案 5 :(得分:0)

我看待这个的方式是,如果我有一个由PHP驱动的网站,并且用户转到http://site/index.aspx,那么我会发送一个404.

尽管index.php在理论上确实存在,但它在我的应用程序中不是有效的URL,所以我也会在这种情况下发送404.