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