如何从mod_rewrite规则中排除CSS,JS,JPG,GIF文件?

时间:2010-09-13 15:30:10

标签: php css apache mod-rewrite

这是我到目前为止所做的:

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

$无论有时包含/,所以如果我使用我当前的规则去/ what / whatever2,它假设css位于/ whatever / ssi / *。css。

我希望所有这一切都有道理。

所以,基本上我只想写一个条件,说“如果它是一个css文件,不要应用这些规则。”

感谢您提供的任何帮助:)。

4 个答案:

答案 0 :(得分:4)

您遇到的问题不是将mod_rewrite应用于css文件,而是将html中的路径应用于css是相对的。浏览器只是从正确的相对路径请求css。你真的有两个选择。

  1. 使用相对于域而不是页面的css路径(例如使用/ssi/styles.css而不是ssi / styles.css)
  2. 创建重写规则以将所有css重定向到正确的URL。 (例如RewriteRule(* .css)/ ssi / $ 1

答案 1 :(得分:3)

预计您正在使用带有mod_rewrite模块的Apache,您应该尝试使用RewriteCond指令。以下示例使用RewriteRule指令从RewriteCond中排除以下行的所有匹配项。 规则基本上是正则表达式。我的示例中的那个排除了以favicon.ico开头的所有内容以及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

答案 2 :(得分:0)

  

...它假设css位于/whatever/ssi/*.css。
  我只想写一个条件,说“如果它是一个css文件,不要应用这些规则。”

这直接转换为

RewriteCond %{REQUEST_URI} !^/whatever/ssi/[^/]+\.css$
RewriteRule ...

答案 3 :(得分: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或使用绝对网址。