MOD_REWRITE所有请求子目录403的问题

时间:2015-04-08 14:09:44

标签: php angularjs apache .htaccess mod-rewrite

我在MVC样式框架中使用典型的apache mod_rewrite,

目录结构

  • ROOT
    • .htaccess
    • 应用
      • 控制器
      • 资产
    • 公共
      • JS​​
      • CSS
      • 的.htaccess
    • 系统

在我的项目的ROOT目录中,我有一个.htaccess将所有调用发送到除文件和目录之外的公共文件夹,在公共文件夹中我然后有另一个.htaccess,它将所有调用发送到index.php,文件和目录除外两者都在底部。

现在我将所有bower组件保存在应用程序文件夹中并在开发期间,然后缩小,压缩和连接等到公共目录中以便发布。

这意味着在发布期间我只需要包含一个脚本src =" /js/mylongscript.js"

在开发过程中,我希望能够访问应用程序目录中的未经修改的代码,我认为这些代码已经将规则放在适当的位置,并且当我在浏览器中键入文件的URL时它会这样做。

但当包含在src =" application / assets / angular.js"我一直收到403权限错误。

我尝试了以下src格式

<script src="http://kratos.io/application/assets/angular.js"></script>
<script src="application/assets/angular.js"></script>

但这适用于公共目标中的缩小

<script src="http://kratos.io/js/longscript.js"></script>
<script src="js/longscript.js"></script>

MY ROOT .htaccess - 将所有来电定向到公共文件夹

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?kratos.io$
RewriteCond %{REQUEST_URI} !^/public/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.*)$ /public/$1
RewriteCond %{HTTP_HOST} ^(www.)?kratos.io$
RewriteRule ^(/)?$ public/$1 [L] 

我的PUBLIC .htaccess

 RewriteEngine On
RewriteBase /public/
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]

这是我的重写规则的问题吗? 。 。 。我需要另一个吗? 。 。 。当作为url类型而不是作为脚本src包含时,它是如何工作的? 。 。我是否需要application / assets文件夹的例外?或者从公共目录跳回到ROOT的规则?

我已阅读本文&gt;&gt; http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritebase

和此&gt;&gt; http://httpd.apache.org/docs/2.4/rewrite/flags.html

并且在过去的3个小时内一直在搜索谷歌,但我不确切知道我做错了什么我不知道如何解决它

注意Eventaully角度脚本和组件也将位于应用程序文件夹中,并从公共目录访问,因此这也将阻止其工作。 。 。

更新

自从尝试第一个答案后我得到了错误

[Wed Apr 08 16:05:18.484189 2015] [authz_core:error] [pid 8148:tid 964] [client 127.0.0.1:63826] AH01630: client denied by server configuration: C:/Apache24, referer: http://kratos.io/

所以只需使用wamp

来添加我的vhost配置
<VirtualHost *:80>
    ServerAdmin webmaster@kratos.io
    ServerName kratos.io
    ServerAlias www.kratos.io
    DocumentRoot "r:\Server\vhosts\kratos"
        <Directory "r:\Server\vhosts\kratos">
            AllowOverride All
            Order allow,deny
            Allow from all
            Require all granted
        </Directory>
</VirtualHost>

2 个答案:

答案 0 :(得分:0)

如果您想直接访问/Application目录下的文件,请将根.htaccess更改为:

RewriteEngine on

RewriteCond %{HTTP_HOST} ^(www\.)?kratos\.io$ [NC]
RewriteCond %{REQUEST_URI} !^/(public|Application)/ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.*)$ /public/$1 [L]

答案 1 :(得分:0)

完全超出了我认为问题的范围......

道歉!!

我没有提到的是ROOT目录中的其余.htaccess文件。

它有额外的功能来防止黑客和攻击。 。我防范的一件事是常见的指纹攻击,下面的代码类似于其他框架上使用的代码

<IfModule mod_rewrite.c>
 RewriteRule ^images/stories/([^/]+/)*([^/.]+\.)+(jp(e?g|2)?|png|gif|bmp|css|js|swf|ico)$ - [L]
 RewriteCond %{HTTP_REFERER} .
 RewriteCond %{HTTP_REFERER} !^https?://(www\.)?kratos.io\.com [NC]
 RewriteCond %{REQUEST_FILENAME} -f
 RewriteRule \.(jp(e?g|2)?|png|gif|bmp|css|js|swf|ico)$ - [F]
</IfModule>

请注意错误

RewriteCond %{HTTP_REFERER} !^https?://(www\.)?kratos.io\.com [NC]

将行更正为

RewriteCond %{HTTP_REFERER} !^https?://(www\.)?kratos\.io [NC]

它不再认为我试图攻击该文件,因为我在脚本标记中的url与条件匹配。