2

我正在开发一个 php 应用程序,我对 Apache 和 Mod Rewrite 有一点问题。有人知道这里有什么问题吗?:

RewriteEngine on
RewriteBase /mysite/
RewriteRule ^css\/css\.css css/css.php [L]
RewriteRule ^js\/js\.js js/js.php [L]
RewriteRule !^img\/.* index.php

当我把http://localhost/css/css.css出现 index.php 时,也许我遗漏了一些东西......为什么当 url 与第一条规则匹配时,apache 不会停止重写过程?

'last|L'(最后一条规则)

在这里停止重写过程,不再应用任何重写规则。这对应于 Perl 的 last 命令或 C 语言的 break 命令。使用此标志可防止当前重写的 URL 被以下规则进一步重写。例如,使用它将根路径 URL ('/') 重写为真实的 URL,例如,'/e/www/'。

自 3 小时以来,我已经阅读了论坛和文档,但我仍然遇到同样的问题。

提前致谢。

4

4 回答 4

5

Centauro12,问题是,[L] 标志实际上停止了通过以下规则的传播,但随后(如果您在 .htaccess 文件中)URL 映射又重新开始。这意味着,您的所有规则都将被第二次处理。有关详细信息,请参阅Apache 重写指南

因此,您需要为重写的 php 脚本显式禁用重写:

RewriteRule ^css/css.php - [L]
RewriteRule ^js/js.php - [L]

或更紧凑(尽管可能不是您想要的):

# don't rewrite anything that really exists
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule .* - [L]
于 2009-11-23T16:56:28.933 回答
1

尝试

RewriteRule ^/css/css\.css css/css.php [L]
RewriteRule ^/js/js\.js js/js.php [L]
RewriteRule ! /^img/.* index.php

IE。如果您^模式锚定到字符串的开头,请以/. 模式与以 .开头的URL-paths匹配/

编辑

以上仅对服务器配置、虚拟主机和目录上下文有效。如果上下文是 .htaccess,则在匹配规则之前(并在之后添加),包括第一个斜杠在内的每个目录前缀被剥离,所以^/这里不需要。

于 2009-11-21T16:10:48.520 回答
1

我找到了一个解决方案:

RewriteEngine on
RewriteBase /mysite/

RewriteRule ^css\/css\.css css/css.php [L]
RewriteRule ^css\/(.*)$ css/$1 [L]
RewriteRule ^js\/js\.js js/js.php [L]
RewriteRule ^js\/(.*)$ js/$1 [L]
RewriteRule ^img/(.*)$ img/$1 [L]
RewriteRule ^(.*)$ index.php?rewrite=$1 

它工作正常,但我不知道为什么它是必要的

RewriteRule ^css\/(.*)$ css/$1 [L]

RewriteRule ^js\/(.*)$ js/$1 [L]

我希望它能帮助任何人。

谢谢!:)

于 2009-11-23T16:48:51.007 回答
0

在使用“^css...”开始表达式之前,您可能必须将重写基数设置为“/”

RewriteBase /
于 2009-11-21T16:08:08.120 回答