【问题标题】:.htaccess 403 Forbidden if url contains directory with another htaccess file.htaccess 403 Forbidden if url contains directory with another htaccess file
【发布时间】:2014-11-27 20:28:01
【问题描述】:

我在网站根目录中有一个.htaccess 文件,其规则如下:

Options -MultiViews
Options All -Indexes

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA]

还有一个子目录中的.htaccess 文件(我们称之为Foo):

Order Allow,Deny
Deny from all

<files ~ "\.(js|jpe?g|png|gif|bmp|css)">
    Allow from all
</files>

当我访问例如:/test/test/test 时,它通常会将我重定向到 index.php,但是当我的 URI 从现有目录开始时,它会引发 403 错误,例如:/Foo/test/test/test => 403 错误

所以我的问题是:如何让它重定向到index.php,即使它与现有的子目录匹配?

注意:Sub-Directoy 必须包含一个 .htaccess 文件以禁止直接访问其中的文件。

另一个问题:如何使除(图像、css、js)之外的所有请求(甚至是现有文件和目录)转到index.php?url=$1?当我删除RewriteCond %{REQUEST_FILENAME} !-f时,它会重定向到@ 987654332@或给Internal Error

【问题讨论】:

  • 如果您在特定目录中覆盖 .htaccess,则该 .htaccess 现在负责让“合法”路由通过。因此,如果您有 100 个目录,每个目录都有自己的 .htaccess 文件,那么您有 100 倍的责任让这些 .htaccess 文件允许您需要的基本路由。

标签: php apache .htaccess mod-rewrite redirect


【解决方案1】:

保持你的根 .htaccess 如下:

Options All -Indexes -MultiViews
RewriteEngine On

RewriteCond %{REQUEST_URI} ^/(.*)$ [NC]
RewriteCond %{REQUEST_URI} !(^/index\.php|\.(js|jpe?g|png|gif|bmp|css))$ [NC]
RewriteRule ^ /index.php?url=%1 [QSA,L]

保持您的/Foo/.htaccess 如下:

RewriteEngine On
RewriteOptions Inherit

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule !\.(js|jpe?g|png|gif|bmp|css)$ - [F,NC]
  • RewriteOptions Inherit 将从父 .htaccess 继承规则
  • 这里最好使用mod_rewrite 代替allow/deny 进行更精细的控制

【讨论】:

  • 如果没有 RewriteBase,它就无法工作,但它会给出错误的结果
  • 提供更多细节,因为it gives wrong results 没有告诉我任何事情。
  • 太棒了!对不起,也许我做错了什么,或者你在我测试后编辑了它,但现在它工作得很好!唯一的问题是,当我只输入像 /Foo 这样的子目录名称时,它会显示 403 错误,对于像 /Foo/test 这样的任何其他组合,它都可以工作
  • 没有注意到您从我的新问题中添加了条件,现在在子目录中分离 .htaccess 文件是无用的,将其从子目录中删除,现在一切正常!
猜你喜欢
  • 1970-01-01
  • 2012-04-21
  • 1970-01-01
  • 2019-12-18
  • 2011-08-09
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 2018-12-21
相关资源
最近更新 更多