0

所以,我正在使用我正在构建的 PHP 应用程序玩一些 url。

我正在使用 .htaccess 使用 mod_rewrite。看起来是这样的:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule (.*) index.php/$1
</IfModule>

我想如果一个 URL 是这样写的:

http://localdomain.com/controller

作为 $_SERVER['PATH_INFO'] 的一部分,我希望“控制器”结束时不会出现问题。但是,在运行 Apache 2.2.22 的 Ubuntu 12.04 上,我得到了 404 Not Found 错误:

NOT FOUND
The requested URL /index.php/controller was not found on this server.

似乎在 index.php 后面的斜杠后正确处理了“控制器”,但是有谁知道为什么我得到 404 而不是预期的响应?

最终,我试图捕获“控制器”以在我正在构建的 MVC 框架中使用。

在这种情况下,我有一个非常简单的 index.php,只有以下内容:

<?php
echo $_SERVER['PATH_INFO'];

但是,我仍然收到 404 错误,而不是预期的路径信息。

注意:仅访问http://localdomain.com/http://localdomain.com/index.php即可。mod_rewrite 已打开且正在工作,并且 AllowOverride 设置为 All。

4

3 回答 3

2

如果您正在运行 apache 2.2.22,那么您的 PHP 代码现在负责在找到控制器函数时指定 200 响应。

与 2.2.14 相比,Apache 2.2.22 似乎采用了不同的重写理念。说来话长,但很有道理。它假设如果您正在重写像 CodeIgniter 那样的前端控制器,那么 PHP 代码负责决定是否找到了请求的 URI。Apache 等待 PHP 代码发送 header('HTTP/1.1 200 OK'),如果没有,则发送 header('HTTP/1.1 404 Not Found')。

有趣的是,来自控制器的实际内容也可能在响应正文中发送。但是如果响应代码是 404(如 MSIE、wget 等),许多 HTTP 客户端会忽略这一点。

简短的版本是 apache 2.2.14(铂金版)是乐观的,除非 PHP 另有规定,否则假设为 200,而 apache 2.2.22 是悲观的,除非 PHP 另有规定,否则假设为 404。

所以在你的代码的某个地方,你必须放置:

header('HTTP/1.1 200 OK');

这应该放在前端控制器确定 URI 有效并且存在并且可以为此 URI 调用的类和方法之后,但在实际调用类和方法之前。

在 CodeIgniter 2.1.3 中,它看起来像这样:

// Added this line for Apache 2.2.22
header('HTTP/1.0 200 OK');
// Call the requested method.
// Any URI segments present (besides the class/function) will be passed to the method for convenience
call_user_func_array(array(&$CI, $method), array_slice($URI->rsegments, 2));
于 2012-10-12T19:26:27.947 回答
0

这是我为 MVC 创建并使用的 .htaccess :

# Mod Rewrite
<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d

    RewriteRule ^(.*)$          /root/index.php/$1 [PT,L]
</IfModule>

尝试添加^$+[PT,L]

于 2012-07-06T19:45:30.520 回答
0

如果您希望在没有 index.php 的情况下重写 URL,那么只需使用:

RewriteRule ^(.*)$ index.php [NC,L]
于 2012-07-06T19:47:34.733 回答