【问题标题】:Simple mod_rewrite rules broken after new c9 version新 c9 版本后简单的 mod_rewrite 规则被打破
【发布时间】:2014-08-07 16:23:01
【问题描述】:

我正在处理一个托管在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。如果我将 Astralis/resources 中的 /css、/img 和 /js 文件夹移回根目录,则所有资源都会正确加载。这个问题在 c9 的新版本之后开始出现,没有更改 .htaccess 文件、代码库或目录结构。

关于发生了什么的任何线索?我该如何调试这种东西?任何编写 mod_rewrite 规则的一般提示/技巧也将不胜感激。谢谢。

【问题讨论】:

    标签: .htaccess mod-rewrite cloud9-ide


    【解决方案1】:

    由于 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]
    

    【讨论】:

    • 请求现在返回 500 个
    • 即使我取出检查资源是否存在的线路,我仍然得到 500 个
    • 您能否检查您的 Apache error.log 以了解实际错误。
    • 好主意 -- 错误似乎来自 Astralis/resources 中的另一个 .htaccess。 /home/ubuntu/workspace/Astralis/resources/.htaccess:无效命令“标题”,可能拼写错误或由服务器配置中未包含的模块定义
    • 所以Header 指令无法识别。看起来您的 Apache 配置中未启用 mod_headers
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-10
    • 1970-01-01
    • 2012-07-23
    相关资源
    最近更新 更多