Php htaccess重写子目录中的基
在一个项目中,我在许多子目录中都有.htaccess文件 以下是一个示例结构: project/.htaccess project/admin/.htaccess project/admin/pdf/.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
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
反向引用,注意在检查任何条件之前部分评估了规则本身(应用了模式)。这正是我要寻找的,它是有效的。你能解释一下这些条件的逻辑吗?谢谢,先生。稍后我将检查并尝试第二次更新。现在第一个很好用!