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
    %2
    等,但RHS端,即条件字符串不能使用这些
    $1
    $2
    %1
    %2
    变量
  • 在RHS条件部分内,我们可以使用的唯一反向参考是内部反向参考,即我们在该条件本身中捕获的组。它们由
    \1
    \2
    等表示
  • 在您的
    RewriteCond
    中,第一个捕获的组是
    ([^#]*)
    。它将由内部反向引用“\1”表示
  • 您可以指出,此规则基本上是通过比较
    %{REQUEST\u URI}
    $0
    动态查找
    RewriteBase
    %{REQUEST_URI}
    的示例将是
    /directory/foobar.php
    ,相同示例URI的
    $0
    示例将是
    foobar.php
    ^([^#]*)#(.*)\1$
    将差异放入第二个捕获组
    %2
    \2
    。在这里,t将使用值
    /directory/
    填充
    %2
    \2
    ,该值稍后用于设置env变量
    %{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
    %2
    等,但RHS端,即条件字符串不能使用这些
    $1
    $2
    %1
    %2
    变量
  • 在RHS条件部分内,我们可以使用的唯一反向参考是内部反向参考,即我们在该条件本身中捕获的组。它们由
    \1
    \2
    等表示
  • 在您的
    RewriteCond
    中,第一个捕获的组是
    ([^#]*)
    。它将由内部反向引用“\1”表示
  • 您可以指出,此规则基本上是通过比较
    %{REQUEST\u URI}
    $0
    动态查找
    RewriteBase
    %{REQUEST_URI}
    的示例将是
    /directory/foobar.php
    ,相同示例URI的
    $0
    示例将是
    foobar.php
    ^([^#]*)#(.*)\1$
    将差异放入第二个捕获组
    %2
    \2
    。在这里,t将使用值
    /directory/
    填充
    %2
    \2
    ,该值稍后用于设置env变量
    %{env:BASE}
    ,即
    e=BASE:%2

是的,稍加修改即可工作。似乎
%{ENV:BASE}
已经有一个尾随斜杠,所以