【问题标题】:htaccess rewritebase in subdirectorieshtaccess rewritebase 在子目录中
【发布时间】:2023-03-16 16:15:01
【问题描述】:

在一个项目中,我在许多子目录中有 .htaccess 文件。

这是一个示例结构:

项目/.htaccess

project/admin/.htaccess

project/admin/pdf/.htaccess

在最后一个中,我成功使用了以下内容:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /project/admin/pdf/
RewriteRule ^([pdf\.actions]+)$ pdf.out.actions.php [QSA]

如果项目文件夹直接放在根目录中,则此方法可以正常工作。 所有其他子目录都有相同的 htaccess 逻辑,现在如果用户需要将项目放在任何其他目录而不是根目录下,他/她必须更改项目所有子目录中所有 htaccess 文件中的所有 RewriteBase。

我的问题:如何重写我的 htaccess 内容,所以我得到与上面提到的相同的结果,但使用“动态”基础或不使用 Base...等? 我尝试了很多事情都没有成功。

我删除了RewriteBase /project/admin/pdf/ 行并对其进行了测试,我发现找不到站点...等等!

有什么想法吗?

谢谢

【问题讨论】:

    标签: php .htaccess mod-rewrite url-rewriting subdirectory


    【解决方案1】:

    您可以尝试在规则顶部添加如下内容:

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

    然后,您必须在任何地方都包含BASE 环境变量,而不是使用RewriteBase。例如:

    RewriteRule ^([pdf\.actions]+)$ %{ENV:BASE}/pdf.out.actions.php [QSA]
    

    条件做了几件事情,但两个规则都没有改变 URI 中的任何内容,只是添加了环境变量。

    第一个条件是必要的,因为它在对其进行任何操作之前获取请求的 URI,并将其存储。这一点很重要,因为规则中的(.*) 分组已将基础剥离。我们想要去掉基础的未更改的 URI。所以URI 环境变量是去掉了基础的URI。

    第二个条件是必要的,因为它将URI 环境变量与%{REQUEST_URI} 进行比较,%{REQUEST_URI}整个 URI,包括基础。这种比较产生了我们被剥离的部分或基础,并将存储在BASE 环境变量中。

    ^$ 匹配的条件只是确保这是第一次通过规则(意味着没有设置任何环境变量)。重写引擎会循环,所以我们只想第一次设置这些


    编辑:实际上,现在我正在查看它,您可能会忽略第一个:

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

    使用与规则匹配的$1 反向引用,注意在检查任何条件之前对规则本身进行部分评估(应用模式)。

    【讨论】:

    • 这正是我正在寻找的,并且它有效。你能解释一下这些 RewriteConditions 的逻辑吗?非常感谢
    • 非常感谢先生。我稍后会检查并尝试第二次更新。现在第一个工作正常!
    猜你喜欢
    • 1970-01-01
    • 2017-08-22
    • 2013-04-03
    • 2019-03-23
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 2013-05-17
    • 2013-08-27
    相关资源
    最近更新 更多