2012-07-06 28 views
0

所以,我正在玩一个PHP的应用程序,我正在建设。Apache/PHP的URL解析问题

我正在使用mod_rewrite使用.htaccess。这里是什么样子:

<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”的部分结束]。然而,在Ubuntu 12.04运行的Apache 2.2.22我收到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。

回答

2

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

Apache 2.2.22似乎采取了与2.2.14相比改写的不同理念。长话短说,但它是有道理的。它假定如果你正在像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,但在实际调用类和方法之前。

在笨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)); 
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]

+0

这似乎并没有帮助。我仍然得到了相同的404。就好像Apache不允许重写工作一样,但我已经测试过了。 – 2012-07-06 19:57:52

+0

你在'httpd.conf'里面有'AllowOverride All'命令吗?你有'mod_rewrite'安装?这不是'.htaccess'文件的错误,因为我知道我的工作正常。问题出在Apache2或其他地方,而不是文件。 – 2012-07-06 19:58:59

+0

这很奇怪,所以这就是我在这里发布问题的原因。是的,AllowOverride设置为All并且mod_rewrite也被安装。在运行CakePHP或Zend Framework的问题中,我在开发环境中安装了许多其他站点,并且它们都正常工作。我知道我必须失去一些东西。 – 2012-07-06 20:03:38

0

如果你期待的URL,而不该指数将被改写那么只需使用:

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