使用<base>
- 标签是一个很好的解决方案,大多数浏览器似乎应付自如。除IE之外还有一些问题,就像预料的那样......显然你也可以遇到一些其他有趣的问题,see discussion here。
因此,对于这不是一个选项的人来说,我已经研究过替代方案(“硬性方法”)。
通常你存储的CSS/JS /静态图像/其他的东西是这样的:
index.php
js/
css/
imgs/
和你想要的JavaScript和样式表等可用,不管有多少斜线有在URL中。如果您的网址是/site/action/user/new
那么你的浏览器将请求
/site/action/user/css/style.css
/site/action/user/css/framework/fonts/icons.ttf
/site/action/user/js/page.js
/site/action/user/js/jquery/jquery.min.js
/site/action/user/js/some/library/with/deep/dir/structure/file.map
因此,这里有Apache来解决这个问题的一些重写规则...首先,如果目标磁盘上实际存在的,不重写:
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^.*$ - [L,QSA]
在换句话说,如果传请求文件名是一个目录或IF请求文件名是一个文件,然后不重写( - ),最后一个规则(L)并传递任何GET参数(QSA,查询字符串追加)。您也可以使用
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -l
RewriteRule ^.*$ - [L,QSA]
如果您还需要符号链接。接下来,我们希望即使请求呈现错误的基本目录,也能找到javascript和样式表,如上所示。
RewriteRule ^.*/js/(.*)$ js/$1 [L]
RewriteRule ^.*/css/(.*)$ css/$1 [L]
该模式是非常明显的,只是用目录名称替换'css'。这仍然有一个问题,特别是对于大量的JavaScript和样式表,库等大型网站 - 正则表达式是贪婪的。举例来说,如果你有一个JavaScript目录是这样的:
js/some/library/js/script.js
和你的要求去/site/action/user/new
,浏览器会要求/site/action/user/new/js/some/library/js/script.js
,其重写引擎然后将改写为
js/script.js
因为第一个.*
是贪婪的,匹配/site/action/user/new/js/some/library
。切换到非贪婪的正则表达式并没有什么意义,因为"the rewrite engine repeats all the rules until the URI is the same before and after an iteration through the rules."
还有一个问题,那就是每个需要免除重写的目录都需要一个相对“昂贵”的正则表达式。这两个问题都可以通过将每个静态组件放入具有“不寻常”名称的子目录中来解决(实际上,这是最好的解决方案imo - 任何有更好主意的人都可以发布它)。
目录结构会再看看这样的:
index.php
mystrangedir/js/
mystrangedir/css/
mystrangedir/imgs/
当然,这需要在代码中插入随处可见 - 与大现有的代码库项目,这可能会非常棘手。但是,你只需要目录豁免一个正则表达式,则:
RewriteRule ^.*/mystrangedir/(.*)$ mystrangedir/$1 [L]
自动构建系统(如一饮而尽,咕噜....)可以用来检查是否“mystrangedir”不作为目录存在低于本身的任何地方(这将再次甩掉重写引擎)。
随意将mystrangedir
更名为static_content
这样的更明智的东西,但它更合理,它更有可能是目录名已在某些库中使用。如果你想要一个绝对安全的目录名称,它以前从未被使用过,请使用加密哈希,例如010f8cea4cd34f820a9a01cb3446cb93637a54d840a4f3c106d1d41b030c7bcb
。这相当长;您可以通过缩短它来在唯一性和正则表现之间进行权衡。
你能更清楚地描述出了什么问题吗? – 2011-04-29 09:29:28
您是否尝试过'RewriteCond%{REQUEST_FILENAME}!-f'? – 2011-04-29 09:29:46
不幸运。 – 2011-04-29 09:36:35