【问题标题】:Incomprehensible htaccess rewrite难以理解的 htaccess 重写
【发布时间】:2015-02-28 01:57:45
【问题描述】:

我目前正在尝试使用 mod rewrite 和 htaccess 重写 url。 这是我的 htaccess :

<IfModule mod_rewrite.c>
    RewriteEngine on

    RewriteRule ^lul$     lol/index.html [L]

    RewriteRule ^$ app/webroot/ [L]
    RewriteRule (.*) app/webroot/$1 [L]
</IfModule>

请求的网址:/lul。 这会将 url 重写为 /app/webroot/lul。这怎么可能? 如果我删除最后 2 行(app/webroot/ 行),那么重写工作正常(index.html 文件只显示“Hello”,重写的 url 是 /lol/index.html)。

我的代码如何以及为什么不起作用?

【问题讨论】:

  • 因为您的最后一条规则说,将任何内容重定向到 aap/webroot/anything,并且由于您不验证或强制停止任何规则,它将在链中执行。 L 标志代表 LAST 但它不会强加它,这与 apache 2.4 及更高版本中可用的标志 END 不同,这意味着如果匹配,我们将在此规则之后完成。
  • [L] 标志实际上通常在那里表示如果应用了规则,则重写结束 编辑:好的,我正在尝试 ;)
  • 这是对其实际作用的巨大误解,如果您使用 apache 的 RewriteLog,您可以轻松查看
  • 感谢它的工作。好吧,我在网上使用 htacess 测试仪,它给我写了这个,所以我真的不知道。您可以将此添加为答案,以便我将其设置为已解决吗?

标签: apache .htaccess mod-rewrite url-rewriting


【解决方案1】:

感谢 Prix:

因为您的最后一条规则说,将任何内容重定向到 aap/webroot/anything,并且由于您不验证或强制停止您的任何规则,它将被链式执行。 L 标志代表 LAST,但它不会强加它,这与 apache 2.4 及更高版本中可用的标志 END 不同,这意味着如果匹配,我们将在此规则之后完成。

【讨论】:

  • L 做了它应该做的事情。 Lwhile 循环 中的作用类似于 continue,而 END 的作用类似于 `break。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-22
  • 1970-01-01
  • 2010-10-28
  • 2014-11-15
  • 2014-05-16
相关资源
最近更新 更多