Apache Mod Rewrite:带L参数的RewriteRule。怎么了?

时间:2009-11-21 16:04:52

标签: php mod-rewrite rewrite

我正在开发一个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语言。使用此标志可以防止   当前重写的URL   按照以下规则进一步改写。   例如,用它来重写   根路径URL('/')到真实的,   例如,'/ e / www /'。

我从3个小时开始重写论坛和文档,我仍然遇到同样的问题。

提前致谢。

4 个答案:

答案 0 :(得分:5)

Centauro12,问题是,[L]标志实际上通过以下规则停止传播,但是(如果你在.htaccess文件中)URL映射开始再一次。这意味着,所有您的规则将再次处理。有关详细信息,请参阅Apache Rewrite Guide

因此,您需要明确禁用重写的PHP脚本的重写:

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

或更紧凑(虽然可能不是你想要的):

# don't rewrite anything that really exists
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule .* - [L]

答案 1 :(得分:1)

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

即。如果您^ - 将pattern锚定到字符串的开头,请使用/启动它。模式与URL-paths匹配,以/开头。

编辑

上面的

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

答案 2 :(得分: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]

我希望它能解决任何问题。

谢谢! :)

答案 3 :(得分:0)

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

RewriteBase /