.htaccess 403 Forbidden如果url包含另一个htaccess文件的目录

时间:2014-10-02 19:04:25

标签: php apache .htaccess mod-rewrite redirect

我在网站根目录中有一个.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 =&gt; 403错误

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

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

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

1 个答案:

答案 0 :(得分:1)

保持你的root .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
  • 中的规则
  • 而不是allow/deny更好地使用mod_rewrite来更好地控制