3

在 Zend 框架中,使用 MVC,如果用户显式浏览 http://base/url/index.php而不仅仅是http://base/url,系统认为真正的基本 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 是否有内置的方法来解决这个问题。

4

6 回答 6

5

您可以使用 ZF 来做到这一点Zend_Controller_Router_Route_Static(呸!),例如:

阅读上面链接的手册页,可以找到一些非常好的示例。

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

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

于 2009-05-23T13:46:35.967 回答
2

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

RewriteRule ^index.php/(.*)$ /$1 [r=301,L]
于 2009-07-22T21:32:02.753 回答
2

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

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

我的看法是,如果我有一个由 PHP 提供支持的网站并且用户访问http://site/index.aspx,那么我会发送 404。

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

于 2009-07-22T16:51:36.407 回答
0

我认为您不应该使用路线来执行此操作。

这是一个不应该通过这种方式解决的普遍问题。

您最好必须在 .htaccess 中执行此操作,这将为您提供一种更好、更简单的方式将用户重定向到您想要的位置,例如错误页面或索引。

这是mod_rewrite的文档页面

于 2009-05-23T14:17:23.533 回答
0

我从未使用 Zend Framework 遇到过这个问题。只是不要链接到 index.php 文件。而已。当您将应用程序的地址提供给用户时,只需告诉他们转到http://base/url/

当用户输入http://base/url/她的请求 URI 是base/url并且您的 .htaccess 文件将请求路由到 index.php,但请求 base/url。您不需要从请求中删除“index.php”。因为它不存在。

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

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

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

于 2009-05-23T14:56:32.423 回答