新的c9版本后,简单的mod_rewrite规则被破坏了

时间:2014-08-07 16:23:01

标签: .htaccess mod-rewrite cloud9-ide

我正在处理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规则的一般提示/技巧也将受到赞赏。感谢。

1 个答案:

答案 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]