2009-11-21 52 views
2

我正在开发一个php应用程序,并且我对Apache和Mod Rewrite有一个小问题。任何人都知道什么是错在这里?:Apache Mod Rewrite:用L参数重写规则。怎么了?

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不停止重写的过程配衬?

“最后| L”(最后一条规则)

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

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

在此先感谢。

+1

正在落实的.htaccess规则或在你的主要Apache配置(通常是http.conf)?这将改变mod_rewrite的行为。 –

+0

@Alan,真的,但对于花生画廊来说,怎么样? – Don

+0

它放在.htaccess文件中。 – Centauro12

回答

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] 

我希望它hepls任何人。

谢谢! :)

0

您可能需要设置您的重写基地 “/” 与 “^三网融合”

RewriteBase/
+1

或只是在css和js规则中放置/跟随^ char。 – Cheeso

+0

好吧,我RewriteBase是/ mysite的/ 重写规则!^ IMG \ /.*的index.php 工作正常,但CSS和JS规则不起作用。 任何想法? – Centauro12

+0

@Cheeso:只有在服务器或虚拟主机配置中使用mod \ _rewrite时,才需要使用前导'/'。 – Gumbo

1

开始你的表达之前尝试

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

即。如果您将^ -anchor pattern添加到字符串的开头,请使用/开头。模式与URL-paths相匹配,以/开头。

编辑

以上是有效的服务器配置,虚拟主机,只有目录context。如果上下文是.htaccess,那么在规则匹配(并且之前预先)之前,包括第一个斜杠的每个目录前缀被剥离,所以在这里不需要^/

+0

对不起,我忘记说我的RewriteBase是: RewriteBase/mysite/ 这对我来说不起作用。 谢谢 – Centauro12

+0

在Apache上的大多数例子都省略了斜杠,我从来没有遇到与'^/payload'相比匹配'^ payload'的问题。 – Boldewyn

+0

...即在.htaccess上下文中。 – Boldewyn

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] 
+0

谢谢,我不知道它。 – Centauro12