如何在mod_rewrite规则中排除CSS、JS、JPG和GIF文件?

3
这是我目前的进展:

这是我目前的进展:

RewriteRule ^([A-Za-z0-9_]*)/?$ index.php?page=$1 [NC]
RewriteRule ^([A-Za-z0-9_]*)/([A-Za-z0-9_]*)/?$ index.php?page=$1/$2 [NC]
RewriteRule ^([A-Za-z0-9_]*)/([A-Za-z0-9_]*)/([A-Za-z0-9_]*)/?$ index.php?page=$1/$2/$3 [NC]

所有的CSS文件都位于/ssi/目录下。
网站本身的结构是/index.php?page=$whatever。 $whatever有时包含/,因此如果我访问/whatever/whatever2,根据当前规则,它会假定CSS位于/whatever/ssi/*.css。
希望以上内容都能讲清楚。
所以,基本上我只想编写一个条件,即“如果它是CSS文件,则不应用这些规则”。
非常感谢您提供的任何帮助:)。

已经全部设置好了,似乎一切都运行得很顺利。非常感谢大家的帮助:) - Will
4个回答

4
您所遇到的问题不是mod_rewrite应用于css文件,而是您html中的路径相对。浏览器只是从正确的相对路径请求css。您有两个选项。
1.将css的路径相对于域而非页面(例如使用/ssi/styles.css而非ssi/styles.css)。
2.创建重写规则以将所有css重定向到正确的URL。(例如RewriteRule(*.css)/ssi/$1)

我认为你说得对,现在我想了一下。我正在使用带有项目文件夹的XAMPP。因此,当我执行href="ssi/main.css"时,它会将其附加到当前URL,这是错误的。如果我执行href="/ssi/main.css",它会变成http://localhost/ssi/main.css。它应该转到http://localhost/projects/asdf/ssi/main.css。是否有任何方法可以设置XAMPP / apache以基于项目文件夹具有多个根目录? - Will
不,我认为您不能为一个项目设置多个根目录。但是,如果您的所有CSS都真的在/ssi中,为什么不简单地将路径设置为/ssi / * .css? - cleek
因为,就像我说的,我有多个项目。所以如果我这样做,它会指向 http://localhost/ssi/*.css 而不是实际存放的 http://localhost/projects/asdf/ssi/*.css。 - Will
那么,您可能不幸地只能选择创建我之前描述的RewriteRules。当然,您也可以指定服务器相对路径:/theproject/ssi/style.css。 - cleek
1
我正在研究虚拟主机。可能为每个项目设置一个子域名。如果我能让它工作,那就可以解决所有的问题 :)。 - Will
显示剩余2条评论

3

如果你使用带有mod_rewrite模块的Apache,你可以尝试使用RewriteCond指令。以下示例使用RewriteRule指令排除所有与RewriteCond匹配的内容。 规则基本上是正则表达式。我的示例中排除了所有以favicon.ico开头以及css开头的内容,css是我的样式表所在的文件夹。

RewriteEngine On
RewriteCond $1 !^(favicon\.ico|favicon\.png|media|robots\.txt|crossdomain\.xml|css|js)
RewriteRule ^(.*)$ index.php/$1 [L]

进一步阅读:http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritecond

非常感谢。我相信我的问题已经更加明确,是由于我的标记中使用了相对路径。我正在运行带有项目文件夹的XAMPP,所以如果我使用/ssi/main.css,它会变成http://localhost/ssi/main.css,但实际上应该是http://localhost/projects/asdf/ssi/main.css。您知道有什么解决方法吗? - Will

1
“……它假设CSS位于/whatever/ssi/*.css中。
我只想能够编写一个条件,即“如果是CSS文件,则不应用这些规则。””
RewriteCond %{REQUEST_URI} !^/whatever/ssi/[^/]+\.css$
RewriteRule ...

0

我猜我的解决方案可能是最经验主义的,但它起作用了:

RewriteEngine On

RewriteBase /

RewriteRule ^([a-z0-9-]+)$ /?page=$1 [NC,L]

RewriteRule ^([a-z0-9-]+)/([a-z0-9-]+)$ /?page=$1&action=$2 [NC,L]

这将把http://example.com/?page=contact&action=send翻译成http://example.com/contact/send 我的页面值只包含字母数字和减号作为单词分隔符,但您可以替换值以匹配您需要的任何内容。

当然,在页面中,您需要在所有js、css、img目录前加上斜杠。因此,css/style.css将是/css/style.css或使用绝对URL。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接