【问题标题】:How do I exclude CSS, JS, JPG, GIF files from mod_rewrite rules?如何从 mod_rewrite 规则中排除 CSS、JS、JPG、GIF 文件?
【发布时间】:2011-04-11 17:46:41
【问题描述】:

这是我目前所拥有的:

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 有时包含 /'s,所以如果我转到 /whatever/whatever2,按照我当前的规则,它假定 css 位于 /whatever/ssi/*.css。

我希望所有这些都有意义。

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

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

【问题讨论】:

  • 一切就绪,似乎工作正常。谢谢大家的帮助,大家:)。

标签: php css apache mod-rewrite


【解决方案1】:

我想我的解决方案将是最具经验性的解决方案,但它确实有效:

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。

【讨论】:

    【解决方案2】:

    预计您正在使用带有 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

    【讨论】:

    • 非常感谢。我相信我的问题已经缩小到在我的标记中有相对路径。我正在使用项目文件夹运行 XAMPP,所以如果我执行 /ssi/main.css,它应该是 localhost/ssi/main.css,而它应该是 localhost/projects/asdf/ssi/main.css。你知道有什么方法可以解决这个问题吗?
    【解决方案3】:

    您遇到的问题不是 mod_rewrite 被应用于 css 文件,而是您的 html 到 css 的路径是相对的。浏览器只是从正确的相对路径请求 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",它会做localhost/ssi/main.css。它应该去localhost/projects/asdf/ssi/main.css。有没有办法根据项目文件夹设置 XAMPP/apache 以拥有多个根目录?
    • 不,我认为一个项目不能有多个根目录。但是如果你所有的 css 真的都在 /ssi 中,为什么不简单地创建路径 /ssi/*.css 呢?
    • 因为,就像我说的,我有多个项目。因此,如果我这样做,它将指向 localhost/ssi*.css 而不是 localhost/projects/asdf/ssi*.css 它实际所在的位置。
    • 那么不幸的是,您可能只能选择创建 RewriteRules,就像我之前描述的那样。当然,你可以只指定一个服务器相对路径:/theproject/ssi/style.css
    • 我正在研究虚拟主机。可能为每个项目设置一个子域。如果我能让它发挥作用,它将缓解我所有的问题:)。
    【解决方案4】:

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

    这直接转化为

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-27
      • 2019-08-19
      • 1970-01-01
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多