【问题标题】:.htaccess break all css and js, though i set absolute path.htaccess 打破所有 css 和 js,虽然我设置了绝对路径
【发布时间】:2011-04-24 04:01:49
【问题描述】:

这是我的 .htaccess 文件

Options +FollowSymlinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !=cms

RewriteRule ^([^/]*)/search/([^/]+)$  index.php?lang=$1&id=search&searchword=$2 [L]
RewriteRule ^([^/]*)/([^/]*)$  index.php?lang=$1&id=$2 [L]

它不像我预期的那样工作。

我的.css,.js 文件有绝对路径,例如http://bs.am/finance/css/style.css(我在finance 文件夹中的所有文件)

第一条规则破坏了所有 css 和 js 文件,但如果我替换 rewriteRules 的地方,工作正常。

有人能解释一下这种行为吗?

我也尝试了RewriteCond %{REQUEST_FILENAME} !^(.+)\.css$,但没有帮助。

非常感谢

【问题讨论】:

  • 这个 .htaccess 文件在哪里?
  • @Gumbo .htaccess 文件在 /finance/ 文件夹中

标签: apache url .htaccess mod-rewrite


【解决方案1】:

根据您的问题,您的 .htaccess 文件似乎位于 /finance/ 文件夹中。如果是这种情况,问题在于您的第二个 RewriteRule 将匹配您的脚本和样式表的请求。

您已有的条件可以让您避免此问题,但它们仅适用于它们之后的第一条规则(您的搜索规则)。像往常一样,有几种不同的方法可以解决问题,但最简单的方法是复制您的 RewriteCond 块,以便它也适用于第二条规则。如下所示:

Options +FollowSymlinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 =cms
RewriteRule ^([^/]*)/search/([^/]+)$  index.php?lang=$1&id=search&searchword=$2 [L]

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !=cms
RewriteRule ^([^/]*)/([^/]*)$  index.php?lang=$1&id=$2 [L]

请注意,您甚至可能不需要第一条规则的条件块,因为您的任何真实文件都不太可能与该测试模式匹配。不过,第二个肯定需要它,以防止您的资源被误导。

替代方法

Options +FollowSymlinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond $1 !=cms
RewriteRule ^([^/]*) - [S=2]

RewriteRule ^([^/]*)/search/([^/]+)$  index.php?lang=$1&id=search&searchword=$2 [L]
RewriteRule ^([^/]*)/([^/]*)$  index.php?lang=$1&id=$2 [L]

在这种方法中,如果您的任何条件匹配,我们将跳过接下来的两条规则(由 S=2 指示。这与将条件块应用于它们相同。作为Gumbo mentions,您也可以在条件匹配的情况下,使用L 标志代替S=2 忽略该块之后的每个规则。这些选项中的哪个最合适取决于您将来可能要添加的其他规则.

【讨论】:

  • 非常感谢 Tim,但为什么需要为每个 RewriteRuleRewriteCond?有没有办法,写RewriteCond这将适用于所有规则?
  • @Syom:RewriteCond 的块只适用于下一个RewriteRule,因为 mod_rewrite 引擎无法知道您不再想应用这些条件(没有“结束如果“ 陈述)。因此,因此,您必须将其应用于每个规则,或者反转条件,以便在条件块之后阻止处理规则。
【解决方案2】:

RewriteCond 指令仅属于下一个 RewriteRule。所以你的三个RewriteCond 指令只属于第一个RewriteRule,而不属于没有条件的第二个。

因此,要排除第二个 RewriteRule 的现有文件和目录,您还需要在其他规则前面写相同的 RewriteConds:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !=cms
RewriteRule ^([^/]*)/search/([^/]+)$  index.php?lang=$1&id=search&searchword=$2 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !=cms
RewriteRule ^([^/]*)/([^/]*)$  index.php?lang=$1&id=$2 [L]

但是当请求可以映射到现有文件或目录时,您也可以使用停止重写过程的规则:

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

将此规则放在其他规则之前,重写过程将以此规则停止。

【讨论】:

  • 非常感谢。请解释最后的 RewriteRule。这是什么意思 - ^ - [L]
  • @Syom:^ 是模式,- 是替换,[L] 是标志:^ 匹配任何请求,- 表示不应执行替换,@ 987654335@ 表示这是应该测试的最后一条规则。
猜你喜欢
  • 2021-09-17
  • 1970-01-01
  • 2013-06-27
  • 2020-06-04
  • 2017-04-19
  • 2011-06-26
  • 2013-03-10
  • 1970-01-01
  • 2013-03-07
相关资源
最近更新 更多