将所有裸体子文件夹redirect到子文件夹名称/ public /

我正在尝试做一个.htaccess所有顶级子文件夹redirect/重写到一个子文件夹。

例如,我的目录结构如下所示

 /public_html /site1 /public /site2 /public /site3 /public 

我想任何人去example.com/site1/来从example.com/site1/public文件服务,但我不希望URL必须public

这是我所尝试的:

 RewriteEngine On #RewriteRule /(.?)/ /$1/public/ [L] 

在你的根.htaccess文件中尝试类似下面的内容:

 RewriteEngine On RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteRule ^(site1|site2|site3)/?(.*) /$1/public/$2 [L] 

这针对任何启动 /site1/site2/site3 (请注意,在.htaccess模式不包括斜杠前缀)。 然后使用$1$2反向引用在/site1/<whatever>内部重写请求到/site1/public/<whatever>RewriteRule 模式中的可选斜线确保它也将匹配裸子目录的请求,不包括尾部的斜杠即。 /site1 ,而不是让mod_dir首先发出redirect到/site1/

要重写任何根目录(不仅限于site1site2等),然后将RewriteRule指令更改为:

 RewriteRule ^([^/]+)/?(.*) /$1/public/$2 [L] 

正则expression式[^/]+只匹配第一个path段,即。 除了第一个斜线之外的一切。

RewriteCond指令检查REDIRECT_STATUS环境variables确保我们不会得到重写循环。 第一次调用脚本时, REDIRECT_STATUS未设置,但在第一次重写(或错误状态)时设置为HTTP状态。

 #RewriteRule /(.?)/ /$1/public/ [L] 

你原来的指令有一些问题…

  • .? 只能捕获最多一个字符 – 这是你可选的。
  • /(.?)/将在请求的URL中的任何地方匹配(不在开始处)。 但是请注意,无论如何在.htaccess /目录上下文中(如上所述),无法匹配URLpath开始处的第一个斜杠。
  • 您不捕获URLpath的其余部分,因此只会重写到文档根目录,而不pipe请求的URL是什么。
  • 这将触发一个重写循环。 (导致500内部服务器错误。)