【问题标题】:Apache Mod Rewrite: RewriteRule with L argument. What's wrong?Apache Mod Rewrite:带有 L 参数的 RewriteRule。怎么了?
【发布时间】:2009-11-21 16:04:51
【问题描述】:

我正在开发一个 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 的最后 命令或中断命令 C语言。使用此标志来防止 当前重写的 URL 从 通过以下规则进一步重写。 例如,用它来重写 root-path URL ('/') 到一个真实的, 例如,'/e/www/'。

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

提前致谢。

【问题讨论】:

  • 这些规则是放在 .htaccess 还是你的主要 apache 配置(通常是 http.conf)中?这将改变 mod_rewrite 的行为。
  • @Alan,没错,但是对于花生画廊,怎么样?

标签: php mod-rewrite rewrite


【解决方案1】:

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]

【讨论】:

  • 谢谢,我不知道。
【解决方案2】:

我找到了解决办法:

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】:

    试试

    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,每个目录的前缀包括第一个斜杠会在匹配规则之前被剥离(并在之后添加),所以这里不需要^/

    【讨论】:

    • 对不起,我忘了说我的 RewriteBase 是:RewriteBase /mysite/ 它不适合我。谢谢
    • Apache 的大多数示例都省略了斜杠,与 ^/payload 相比,我在匹配 ^payload 时从未遇到过问题。
    • ...也就是说,在 .htaccess 上下文中。
    • ...我写答案时他没有说。
    【解决方案4】:

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

    RewriteBase /
    

    【讨论】:

    • 或者只是在 css 和 js 规则中的 ^ 字符后面放一个 /。
    • 好的,我的 RewriteBase 是 /mysite/ RewriteRule !^img\/.* index.php 工作正常,但 css 和 js 规则不起作用。有什么想法吗?
    • @Cheeso:只有在服务器或虚拟主机配置中使用 mod_rewrite 时才需要前导 /
    猜你喜欢
    • 2014-01-25
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    • 2012-04-03
    • 2016-07-17
    • 2017-03-30
    相关资源
    最近更新 更多