使用mod_rewrite rewriterules将子目录重定向到另一个子目录

时间:2015-02-02 18:16:47

标签: apache .htaccess mod-rewrite

在子目录.htaccess内的alpha(从根目录下面的几个目录:http://domain.com/subsite/alpha/.htaccess)我希望捕获所有文件请求:

  • http://domain.com/subsite/alpha/images/

并将其重定向到:

  • http://domain.com/subsite/alpha/img/

我的.htaccess看起来像这样:

RewriteRule ^images/(.*)$ %{REQUEST_URI}/\.\./\.\./img/$1 [R=302,NC,L]

仅当/images内没有其他目录时,此方法才有效。我可以让它像root一样工作

RewriteRule ^images/(.*)$ /subsite/alpha/img/$1 [R=302,NC,L]

但我必须手动将其从alpha更新为betapreprod等。

基本上,我需要一种方法来隔离^images/之间的所有内容。我尝试了一些变化:

RewriteRule ^(.*)images/(.*)$ /$1/img/$2 [R=302,NC,L] RewriteRule ^(.*)images/(.*)$ ^$1/img/$2 [R=302,NC,L]

但它不起作用,因为.htaccess位于alpha,并且不知道它与root之间的内容。因此,在上文中,$1不是/subsite/alpha,而是/alphaimages/之间的任何内容。

1 个答案:

答案 0 :(得分:3)

您可以使用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]

动态RewriteBase的工作原理:

  • 它将REQUEST_URI变量(完整路径)与RewriteRule匹配的URI(相对于当前路径)进行比较,并在%{ENV:BASE}变量中得到差异。
  • 您可以在$0中使用从RewriteRule抓取的RewriteCond,因为mod_rewrite实际向后处理规则集。它从RewriteRule中的模式开始,如果匹配,则继续检查一个或多个RewriteCond
  • 正如您在RewriteCond中看到的那样,LHS(测试字符串)可以使用反向引用变量,例如$1$2%1%2等,但RHS方面即条件字符串无法使用这些$1,{{1} }或$2%1变量。
  • 在RHS条件部分内部,我们可以使用的是内部反向引用,即我们在此条件下捕获的组本身。它们由%2\1等表示。
  • \2首次捕获的群组中RewriteCond。它将由内部反向引用`\ 1。
  • 表示
  • 您可以通过比较([^#]*)RewriteBase来标记此规则基本上是动态查找%{REQUEST_URI}$0的示例将为%{REQUEST_URI},同一示例URI的/directory/foobar.php示例将为$0foobar.php正在为第二个被捕获的群组^([^#]*)#(.*)\1$%2带来差异。这里t将使用值\2填充%2\2,稍后在设置env变量/directory/时使用该值%{ENV:BASE}
相关问题