我在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匹配。