我正在处理Cloud9 IDE上托管的项目。我设置了一组简单的mod_rewrite规则,但在c9的新版本推出后它们不再有效。我花了很长时间来解决这些规则(我在这方面充其量只是新手)我很困惑为什么这些规则不再起作用(AFAIK,新的c9版本不应该影响mod_rewrite规则)。
以下是规则(位于根.htaccess
)
RewriteEngine on
Options FollowSymLinks
RewriteBase /
RewriteCond %{REQUEST_URI} ^/css/.*$ [OR]
RewriteCond %{REQUEST_URI} ^/img/.*$ [OR]
RewriteCond %{REQUEST_URI} ^/js/.*$
RewriteCond Astralis/resources%{REQUEST_URI} -f
RewriteRule ^(.+)$ Astralis/resources/$1 [L,QSA]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
目标非常简单......所有发送到/css/...
/img/...
或/js/...
的请求都应该在Astralis/resources
内提供相关文件(在检查文件存在之后) )。否则,将其余流量重定向到index.php。
我遇到的问题是所有对资源的请求(css,img,js)都返回404。如果我将/ css,/ img和/ js文件夹从Astralis / resources中移回根目录,则所有资源都会正确加载。这个问题在c9的新版本之后开始发生,没有对.htaccess文件,代码库或目录结构进行任何更改。
有关发生了什么的任何线索?我该如何调试这种东西?任何编写mod_rewrite规则的一般提示/技巧也将受到赞赏。感谢。
答案 0 :(得分:2)
由于Apache需要文件的完整路径才能使用-f
返回true,因此您需要在文件路径之前使用%{DOCUMENT_ROOT}/
。
这样做:
RewriteEngine on
Options FollowSymLinks
RewriteBase /
RewriteCond %{REQUEST_URI} ^/(css|img|js)/ [NC]
RewriteCond %{DOCUMENT_ROOT}/Astralis/resources%{REQUEST_URI} -f
RewriteRule ^(.+)$ Astralis/resources/$1 [L,QSA]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]