2011-04-29 147 views
6

嗨,我有一个问题。 我想让所有的请求重定向到主目录中的索引文件,我已经实现了这一点,但是相对路径存在问题。
当我把地址,如:mydomain.com/something它工作正常,因为路径是相对于主目录。
问题是当我把这样的东西:mydomain.com/something/somethingelse。相对路径的mod_rewrite问题css/js

.htaccess文件:


Options FollowSymLinks 
RewriteEngine On 
# ignore anything that's an actual file 
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f 
# redirect all other traffic to the index page 
RewriteRule . index.php [L] 

如何让CSS/JS工作的任何想法?


编辑:

的是,CSS/JS文件不会被加载的问题时输入的路径有多个斜线
,如:mydomain.com/something/somethingelse

+0

你能更清楚地描述出了什么问题吗? – 2011-04-29 09:29:28

+0

您是否尝试过'RewriteCond%{REQUEST_FILENAME}!-f'? – 2011-04-29 09:29:46

+0

不幸运。 – 2011-04-29 09:36:35

回答

11

毫无疑问最好使用静态文件(css,js,images等)的绝对路径。但是,如果您在多个页面中提供了大量实例,请考虑使用HTML base tag指定相对路径的默认URL。例如:

<base href="http://www.example.com/static/" /> 
+1

你是救星我的一天! – Cammy 2015-06-01 23:32:08

1
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule . index.php [L] 

应该尽管有评论,但显然仍在工

尝试添加RewriteLog和RewriteLogLevel指令以提供更好的细节。

1

这是一个路径解析问题:当使用基本路径/something它决心/css同时/something/somethingelse它解析为/something/css上的相对路径./css

这不能(或者不应该)用mod_rewrite修复。使用绝对路径代替相对路径,所以/css而不是./css

2

使用<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。这相当长;您可以通过缩短它来在唯一性和正则表现之间进行权衡。