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


MOD_REWRITE all requests to subdirectory 403 problems

我在MVC风格的框架内使用典型的apache mod_rewrite,

目录结构

    • .htaccess
    • 应用程序
      • 控制器
      • 资产
    • 公共
      • js
      • css
      • .htaccess
    • 系统

在我项目的ROOT目录中,我有一个.htaccess,它将除文件和目录外的所有调用发送到公用文件夹,在公用文件夹中,我还有另一个.haccess,它将所有调用发送给index.php,但文件和目录都在底部。

现在,我将所有bower组件都保存在应用程序文件夹中,并在开发过程中进行缩小、压缩和concat等操作,以供发布。

这意味着在发布期间,我只需要包含一个脚本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>

我的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] 

我的公众.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包含时,它是如何工作的。应用程序/资产文件夹是否需要例外?还是从公共目录跳回ROOT的规则

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

并且这>gt;http://httpd.apache.org/docs/2.4/rewrite/flags.html

在过去的3个小时里一直在谷歌上搜索,但不知道我到底做错了什么,我不知道如何修复

注意:最终,有角度的脚本和组件也会在应用程序文件夹中,并从公共目录访问,因此这也会阻止它工作。

更新

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

[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>

如果您想直接访问/Application目录下的文件,请将root.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]

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

抱歉!!

我没有提到的是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与Condition匹配。