Regex 具有相对路径css/js的mod_重写问题

Regex 具有相对路径css/js的mod_重写问题,regex,apache,.htaccess,mod-rewrite,redirect,Regex,Apache,.htaccess,Mod Rewrite,Redirect,嗨,我有个问题。 我希望将所有请求重定向到主目录中的索引文件,我已经实现了这一点,但相对路径存在问题。 当我输入地址如:mydomain.com/something时,它工作正常,因为路径是相对于主目录的。 问题是当我放置类似于:mydomain.com/something/somethingelse的内容时 .htaccess文件: Options FollowSymLinks RewriteEngine On # ignore anything that's an actual file

嗨,我有个问题。 我希望将所有请求重定向到主目录中的索引文件,我已经实现了这一点,但相对路径存在问题。
当我输入地址如:mydomain.com/something时,它工作正常,因为路径是相对于主目录的。
问题是当我放置类似于:mydomain.com/something/somethingelse的内容时

.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

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php [L]
尽管有评论,但显然应该有效


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

这是一个路径解决问题:在基本路径
/something
上使用相对路径
/css
时,它被解析为
/css
,而在
/something/somethingelse
上,它被解析为
/something/css


这不能(或者说不应该)用mod_rewrite修复。使用绝对路径而不是相对路径,因此,对静态文件(css、js、图像等)使用绝对路径无疑比使用绝对路径更好。但是,如果您在多个页面中有很多这样的实例,那么考虑使用以指定相对路径的默认URL。例如:

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

使用
-标记是一个很好的解决方案,大多数浏览器似乎处理得很好。除了IE有一些问题,这是意料之中的。。。显然,你也会遇到其他一些有趣的问题

因此,对于那些没有选择的人,我已经研究了另一种选择(“艰难之路”)

通常存储css/js/静态图像/其他类似的内容:

index.php
js/
css/
imgs/
js/some/library/js/script.js
index.php
mystrangedir/js/
mystrangedir/css/
mystrangedir/imgs/
您希望javascript和样式表等可用,无论url中有多少斜杠。如果您的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]
换句话说,如果request文件名是一个目录,或者如果请求文件名是一个文件,则不要重写(-),最后一条规则(L)并传递任何GET参数(QSA,查询字符串append)。你也可以使用

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目录:

index.php
js/
css/
imgs/
js/some/library/js/script.js
index.php
mystrangedir/js/
mystrangedir/css/
mystrangedir/imgs/
您的请求转到
/site/action/user/new
,浏览器将请求
/site/action/user/new/js/some/library/js/script.js
,然后重写引擎将其重写

js/script.js
因为第一个
*
是贪婪的,并且匹配
/site/action/user/new/js/some/library
。切换到非贪婪的正则表达式并没有真正意义,因为

还有一个问题,那就是对于每个需要免于重写的目录,都需要一个相对“昂贵”的正则表达式。这两个问题都可以通过将每个静态组件放入一个具有“不寻常”名称的子目录来解决(实际上,这是imo的最佳解决方案-任何有更好想法的人都可以发布它)

目录结构将如下所示:

index.php
js/
css/
imgs/
js/some/library/js/script.js
index.php
mystrangedir/js/
mystrangedir/css/
mystrangedir/imgs/
当然,这需要在代码中的任何地方插入—对于具有大型现有代码库的项目,这可能很棘手。但是,目录豁免只需要一个正则表达式,然后:

RewriteRule ^.*/mystrangedir/(.*)$ mystrangedir/$1 [L]
自动构建系统(如gulp、grunt……)可用于检查“mystrangedir”是否不作为目录存在于其自身下方的任何位置(这将再次关闭重写引擎)


请随意将
mystrangedir
重命名为更合理的名称,如
static\u content
,但越合理,目录名就越有可能已在某些库中使用。如果您想要一个绝对安全且以前从未使用过的目录名,请使用加密散列,例如
010F8CEA4CD34F820A9A01CB3446CB93637A54D840A4F3C106D1D41B03C7BCB
。这是相当长的比赛;你可以通过缩短它在唯一性和正则表达式性能之间进行权衡。

你能更清楚地描述出哪里出了问题吗?你有没有尝试过
重写cond%{REQUEST\u FILENAME}-f
?你能更清楚地描述出哪里出了问题吗?我猜当我输入address mydomain.com/something/lse/file时,服务器会尝试获取具有相对路径的css文件,例如。/css its getting mydomain.com/something/css,它不存在。你是我这一天的救星!