Apache / PHP url解析问题

时间:2012-07-06 19:44:00

标签: php apache mod-rewrite

所以,我正在使用我正在构建的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。

3 个答案:

答案 0 :(得分:2)

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

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

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

简短版本是apache 2.2.14(在白金上)是乐观的,假设200,除非PHP另有规定,而apache 2.2.22是pesimistic,假设404,除非PHP另有规定。

因此,在代码的某处,您必须放置:

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));

答案 1 :(得分: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]

答案 2 :(得分:0)

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

RewriteRule ^(.*)$ index.php [NC,L]