【问题标题】:mod_rewrite: Demystifying RewriteBase (once and for all)mod_rewrite:揭开 RewriteBase 的神秘面纱(一劳永逸)
【发布时间】:2014-02-15 13:04:35
【问题描述】:

我一直看到这个(为了简洁,我省略了 IfModuleRewriteEngine 指令):

RewriteBase /somedir/                  #1
RewriteRule ^index\.php$ - [L]         #2
RewriteCond %{REQUEST_FILENAME} !-f    #3
RewriteCond %{REQUEST_FILENAME} !-d    #4
RewriteRule . /somedir/index.php [L]   #5

来自documentation(和我的经验):

在 .htaccess 文件中使用重写引擎时,每个目录 RewriteRule 模式的前缀 [...] 被自动删除 匹配并在任何 relative 之后自动添加(未开始 带有斜线或协议名称)替换遇到一个结尾 规则集。有关更多信息,请参阅 RewriteBase 指令 相对替换会添加什么前缀。

现在,上面的第 5 行 不是 一个 relative 替换(注意前导斜杠),所以第 1 行没有效果,因为没有为 " 添加前缀绝对”替换。
那么我的问题是,指令#1 和#5 的一部分之间是否存在冗余?

【问题讨论】:

    标签: php wordpress apache .htaccess mod-rewrite


    【解决方案1】:

    那么我的问题是,指令 #1 和 #5 的一部分之间是否存在冗余?

    不,这实际上不是冗余。只是因为您在这里使用了绝对 URL,它告诉 mod_rewrite 引擎在重写时使用绝对 URL 而不是相对 URL。

    如果你的第 5 行变成:

    RewriteRule . index.php [L]
    

    那么RewriteBase将生效,并将用于将URI重写为:/somedir/index.php

    使用RewriteBase 的主要优点是您无需在同一个.htaccess 文件中的所有规则中不断重复/somedir/

    如何动态获取RewriteBase

    RewriteCond %{REQUEST_URI}::$1 ^(.*?/)(.*)::\2$
    RewriteRule ^(.*)$ - [E=BASE:%1]
    

    关于 WP:

    Wordpress 可以安全地从 RewriteRule 中删除绝对路径,因为它们无论如何都使用绝对路径。但问题是许多 WP 插件会覆盖该 .htaccess 文件,因此他们只是不想依赖 RewriteBase 行的存在。

    【讨论】:

    • 这正是我要说的:给定问题中的第 5 行,第 1 行是多余的。
    • 这正是我试图在我的回答中解释的(阅读到最后一行可能有用的地方)。
    • 我知道,这就是为什么我不明白 Wordpress 总是在 RewriteRule 中重复绝对路径的原因,关键是,这一定是有原因的。
    • 在所有规则中不使用RewriteBase 并继续使用/somdir/ 并没有真正的优势。我见过一些网站所有者希望动态生成RewriteBase 的情况,这样他们就不需要从开发、登台或具有不同路径的实时网络服务器中更改它。
    • 是的,他们可以很好地删除它,因为无论如何他们都在使用绝对路径。但问题是,很多 WP 插件会覆盖 .htaccess 文件,所以他们不想依赖 RewriteBase 行的存在。
    猜你喜欢
    • 2018-04-17
    • 2020-11-08
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 2012-11-08
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多