PHP目录重写规则

时间:2014-01-21 16:28:22

标签: php regex apache .htaccess mod-rewrite

我的MVC php应用程序有以下结构。

/

/Models/
/Views/
/Content/
/libs/

index.php    <-- Controllers
admin.php
blog.php

基本上我希望人们允许在根目录中访问.php文件。 (index.php,admin.php)

例如,只允许访问index.php

<Files *.php>
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
</Files>

<Files index.php>
Order Allow,Deny
Allow from all
</Files>

由于一些奇怪的原因,人们可以访问URL,如index.php / index.php / index.php

或blog.php / test /它将显示输出页面,但无法正确呈现。

为什么这是幸福的?

3 个答案:

答案 0 :(得分:1)

  

由于一些奇怪的原因,人们可以访问URL,如index.php / index.php / index.php

这不是一个BUG,它是一个特征;)

这实际上是一个apache功能。 Apache允许脚本名称后面的附加路径信息。在PHP中你可以从$ _SERVER ['PATH_INFO']获取这个值 URL index.php / a / b将运行脚本index.php,您将在PATH_INFO中获得“a / b”

  

如何禁用此类网址

要禁用此类网址,您需要在apache配置中禁用“AcceptPathInfo”

<Files "*.php">
  AcceptPathInfo Off
</Files> 

您可以在http://httpd.apache.org/docs/2.2/mod/core.html#acceptpathinfo

中找到有关AcceptPathInfo的更多信息

答案 1 :(得分:0)

/index.php/index.php/index.php不是有效路径。根/index.php仍然是服务器正在运行的根。然而,浏览器不够聪明,不知道这一点,所以如果你的css和图像文件的路径是相对的,它现在正在错误的地方寻找它们,这就是你的页面无法正常渲染的原因。

就服务器而言www.test.com/index.php/index.php/index.php与调用www.test.com/index.php相同

但是对于浏览器,如果你在html标题<link href="css/style.css" rel="stylesheet" type="text/css">中有这个,那么它现在正试图在www.test.com/index.php/index.php/css/style.css中找到它,当然它在那里不存在。

答案 2 :(得分:0)

  

Basically I want people to allow acces .php files in the root directory. (index.php, admin.php)

而不是<Files>指令使用mod_rewrite来实现更好的控制:

RewriteEngine On

RewriteCond %{REQUEST_URI} !^/(index|admin)\.php$ [NC]
RewriteCond %{THE_REQUEST} \.php[\s?/] [NC]
RewriteRule ^ - [F,NC]