.htaccess 只允许访问 index.php 和一个目录

Posted

技术标签:

【中文标题】.htaccess 只允许访问 index.php 和一个目录【英文标题】:.htaccess only allow access to index.php and a directory 【发布时间】:2015-08-07 10:05:10 【问题描述】:

我正在使用

RewriteEngine On
RewriteRule ^.*$ ./index.php

通过 index.php 重定向我的所有网站流量,并让我的 php 代码获取 request_uri 并相应地路由每个请求。

我想限制对所有其他文件/目录的访问,除了包含 js 文件、css 文件、图像等的文件/目录。

我发现我可以这样做:

Order deny,allow
Deny from all

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

然后在公共目录中添加另一个 .htaccess 文件以允许某些文件类型。

当我导航到 localhost/mysite/index.php 时,它工作正常,因为 index.php 文件是可访问的。

但是对于任何其他 url,我得到一个 403,例如 /mysite/home/ 是被禁止的,即使我希望它可以正常工作。

我能做些什么来获得预期的行为?

我的完整 .htacces 文件是:

RewriteEngine On

RewriteCond %SCRIPT_FILENAME !-d
RewriteCond %SCRIPT_FILENAME !-f

RewriteRule ^.*$ ./index.php


Order deny,allow
Deny from all

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

编辑:/public/.htaccess 目前看起来像这样:

<Files ~ "\.(xml|css|jpe?g|png|gif|js|pdf)$">
  Allow from all
</Files>

【问题讨论】:

你也可以显示/public/.htaccess吗? @anubhava 我编辑了问题以包含它。 【参考方案1】:

/mysite/.htaccess试试这个代码:

DirectoryIndex index.php
RewriteEngine On

RewriteCond %SCRIPT_FILENAME !-d
RewriteCond %SCRIPT_FILENAME !-f
RewriteRule ^ index.php [L]

RewriteRule !^(public/|index\.php) [NC,F]

【讨论】:

当我去 localhost/mysite/index.php 时它工作正常,但是当我去 localhost/mysite/home/ 时我仍然被禁止。既然重定向到index.php,不应该允许吗? 我以为您只想允许 http://example.com/public/*http://example.com/index.php。不是这样吗? 就是这样,但我也希望能够拥有干净的 url,所以基本上 url localhost/mysite/home/ 是对 index.php$_SERVER['REQUEST_URI'] = "/mysite/home" 的请求。问题是,即使对 localhost/mysite/home/ 的请求应该发送到index.php,它也被.htaccess 禁止 这个 .htaccess 在哪里?在根目录或mysite/mysite/home/ 中。我认为您的要求和您的文件/目录结构不完全同步。 .htaccess 位于mysite。 index.php 文件也在mysite 中。 /mysite/home/ 不是一个实际的目录,它是一个干净 url 的示例,例如 /mysite/anyUserRequest/secondUserRequestParameter/【参考方案2】:

你可以使用:

RewriteEngine on

RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d

RewriteRule ^(.+)$ index.php

这是我用于我的应用程序的 .htaccess。在 public 目录下,我只放置 index.php 和我需要的 JS、CSS 和图片文件,所以不需要过滤掉。任何其他文件(例如上传文件)都保存到公共文件夹之外的文件夹中 - 因此它们不能直接访问 - 只能通过读取它们的 php 脚本。我相信这是“最佳实践”。

【讨论】:

这将是我最后的手段,但我真的很想找出我的 .htaccess 有什么问题,并让它与我当前的文件结构一起工作

以上是关于.htaccess 只允许访问 index.php 和一个目录的主要内容,如果未能解决你的问题,请参考以下文章

.htaccess 拒绝访问图像文件夹,但允许访问查看单个图像

.htaccess 允许图像直接显示

htaccess 规则以在访问 http://localhost 时提供 index.php 而不是 index.html

如何阻止对根文件夹中除 index.php 之外的所有 .php 的访问(通过 .htaccess)?

删除 index.php url 重写 .htaccess

使用 .htaccess 服务 index.html 或 index.php