Apache 使用mod_rewrite rewrite规则将子目录重定向到另一个子目录
在子目录Apache 使用mod_rewrite rewrite规则将子目录重定向到另一个子目录,apache,.htaccess,mod-rewrite,Apache,.htaccess,Mod Rewrite,在子目录alpha内的.htaccess中(根目录下的几个目录:http://domain.com/subsite/alpha/.htaccess)我想捕获以下文件的所有请求: http://domain.com/subsite/alpha/images/ 并将其重定向到: http://domain.com/subsite/alpha/img/ 我的.htaccess如下所示: RewriteRule^images/(.*)$%{REQUEST\u URI}/\.\./\.\./.\.
alpha
内的.htaccess
中(根目录下的几个目录:http://domain.com/subsite/alpha/.htaccess
)我想捕获以下文件的所有请求:
http://domain.com/subsite/alpha/images/
http://domain.com/subsite/alpha/img/
.htaccess
如下所示:
RewriteRule^images/(.*)$%{REQUEST\u URI}/\.\./\.\./.\.\./.\.\././img/$1[R=302,NC,L]
这仅在/images
中没有其他目录时有效。我可以让它像这样从根开始工作
RewriteRule^images/(.*)$/subsite/alpha/img/$1[R=302,NC,L]
但是我必须手动将其从alpha
更新为beta
,prepod
,等等
基本上,我需要一种方法来隔离^
和图像/
之间的所有内容。我尝试了一些变化:
RewriteRule^(.*)图像/(.*)$/$1/img/$2[R=302,NC,L]
重写规则^(.*)图像/(.*)$^$1/img/$2[R=302,NC,L]
但是它不起作用,因为
.htaccess
位于alpha
中,并且不知道它和root之间有什么。因此,在上面,$1
不是/subsite/alpha
,而是/alpha
和图像之间的任何内容
您可以使用重写库
并使用相对路径:
RewriteEngine On
RewriteBase /subsite/alpha/
RewriteRule ^images/(.*)$ img/$1 [R=302,NC,L]
或者,如果要避免使用RewriteBase
,请使用此规则生成动态RewriteBase
:
RewriteEngine On
RewriteCond $0#%{REQUEST_URI} ^([^#]*)#(.*)\1$
RewriteRule ^.*$ - [E=BASE:%2]
RewriteRule ^(.*?/)?images/(.*)$ %{ENV:BASE}$1img/$2 [R=302,NC,L,NE]
动态重写库的工作原理:
- 它将
变量(完整路径)与请求URI
匹配的URI(相对于当前路径)进行比较,并在重写规则
变量中获得差异%{ENV:BASE}
- 您可以在
中使用从RewriteCond
捕获的RewriteRule
,因为$0
实际上是向后处理规则集。它从mod_rewrite
重写规则中的模式开始,如果匹配,则继续检查一个或多个
重写条件
- 因此,正如您在重写条件中所看到的,LHS(测试字符串)可以使用反向引用变量,例如
,$1
或$2
,%1
等,但RHS端,即条件字符串不能使用这些%2
,$1
或$2
,%1
变量%2
- 在RHS条件部分内,我们可以使用的唯一反向参考是内部反向参考,即我们在该条件本身中捕获的组。它们由
、\1
等表示\2
- 在您的
中,第一个捕获的组是RewriteCond
。它将由内部反向引用“\1”表示([^#]*)
- 您可以指出,此规则基本上是通过比较
和%{REQUEST\u URI}
动态查找$0
。RewriteBase
的示例将是%{REQUEST_URI}
,相同示例URI的/directory/foobar.php
示例将是$0
foobar.php
将差异放入第二个捕获组^([^#]*)#(.*)\1$
或%2
。在这里,t将使用值\2
填充/directory/
或%2
,该值稍后用于设置env变量\2
,即%{env:BASE}
e=BASE:%2
RewriteBase
和使用相对路径:
RewriteEngine On
RewriteBase /subsite/alpha/
RewriteRule ^images/(.*)$ img/$1 [R=302,NC,L]
或者,如果要避免使用RewriteBase
,请使用此规则生成动态RewriteBase
:
RewriteEngine On
RewriteCond $0#%{REQUEST_URI} ^([^#]*)#(.*)\1$
RewriteRule ^.*$ - [E=BASE:%2]
RewriteRule ^(.*?/)?images/(.*)$ %{ENV:BASE}$1img/$2 [R=302,NC,L,NE]
动态重写库的工作原理:
- 它将
变量(完整路径)与请求URI
匹配的URI(相对于当前路径)进行比较,并在重写规则
变量中获得差异%{ENV:BASE}
- 您可以在
中使用从RewriteCond
捕获的RewriteRule
,因为$0
实际上是向后处理规则集。它从mod_rewrite
重写规则中的模式开始,如果匹配,则继续检查一个或多个
重写条件
- 因此,正如您在重写条件中所看到的,LHS(测试字符串)可以使用反向引用变量,例如
,$1
或$2
,%1
等,但RHS端,即条件字符串不能使用这些%2
,$1
或$2
,%1
变量%2
- 在RHS条件部分内,我们可以使用的唯一反向参考是内部反向参考,即我们在该条件本身中捕获的组。它们由
、\1
等表示\2
- 在您的
中,第一个捕获的组是RewriteCond
。它将由内部反向引用“\1”表示([^#]*)
- 您可以指出,此规则基本上是通过比较
和%{REQUEST\u URI}
动态查找$0
。RewriteBase
的示例将是%{REQUEST_URI}
,相同示例URI的/directory/foobar.php
示例将是$0
foobar.php
将差异放入第二个捕获组^([^#]*)#(.*)\1$
或%2
。在这里,t将使用值\2
填充/directory/
或%2
,该值稍后用于设置env变量\2
,即%{env:BASE}
e=BASE:%2
%{ENV:BASE}
已经有一个尾随斜杠,所以