Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php htaccess重写子目录中的基_Php_.htaccess_Mod Rewrite_Url Rewriting_Subdirectory - Fatal编程技术网

Php htaccess重写子目录中的基

Php htaccess重写子目录中的基,php,.htaccess,mod-rewrite,url-rewriting,subdirectory,Php,.htaccess,Mod Rewrite,Url Rewriting,Subdirectory,在一个项目中,我在许多子目录中都有.htaccess文件 以下是一个示例结构: project/.htaccess project/admin/.htaccess project/admin/pdf/.htaccess 在最后一个示例中,我成功地使用了以下内容: Options +FollowSymLinks RewriteEngine On RewriteBase /project/admin/pdf/ RewriteRule ^([pdf\.actions]+)$ pdf.out.actio

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

以下是一个示例结构:

project/.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内容,这样我就可以得到与上面提到的相同的结果,但是有“动态”基还是没有基…等等? 我尝试了很多事情都没有成功

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

有什么想法吗


谢谢

您可以尝试在规则顶部添加类似的内容:

RewriteCond %{ENV:URI} ^$
RewriteRule ^(.*)$ - [ENV=URI:$1]

RewriteCond %{ENV:BASE} ^$
RewriteCond %{ENV:URI}::%{REQUEST_URI} ^(.*)::(.*?)\1$
RewriteRule ^ - [ENV=BASE:%2]
然后,不要使用
RewriteBase
,而是必须在所有地方都包含
BASE
环境变量。例如:

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

这些条件可以做一些事情,但这两个规则都不会改变URI中的任何内容,只会添加环境变量

第一个条件是必需的,因为它在对请求的URI执行任何操作之前获取该URI并存储它。这一点很重要,因为规则中的
(.*)
分组已剥离了基础。我们需要去掉基址的不变URI。因此,
URI
环境变量是基址被剥离的URI

第二个条件是必需的,因为它将
URI
环境变量与
%{REQUEST\u URI}
进行比较,后者是整个URI,包括基。通过这种比较,我们可以得到剥离的零件,或者说基础,并将其存储在
base
环境变量中

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


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

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

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

这正是我要寻找的,它是有效的。你能解释一下这些条件的逻辑吗?谢谢,先生。稍后我将检查并尝试第二次更新。现在第一个很好用!