我正在尝试做一个.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/ 。
要重写任何根目录(不仅限于site1 , site2等),然后将RewriteRule指令更改为:
RewriteRule ^([^/]+)/?(.*) /$1/public/$2 [L]
正则expression式[^/]+只匹配第一个path段,即。 除了第一个斜线之外的一切。
RewriteCond指令检查REDIRECT_STATUS环境variables确保我们不会得到重写循环。 第一次调用脚本时, REDIRECT_STATUS未设置,但在第一次重写(或错误状态)时设置为HTTP状态。
#RewriteRule /(.?)/ /$1/public/ [L]
你原来的指令有一些问题…
.? 只能捕获最多一个字符 – 这是你可选的。 /(.?)/将在请求的URL中的任何地方匹配(不在开始处)。 但是请注意,无论如何在.htaccess /目录上下文中(如上所述),无法匹配URLpath开始处的第一个斜杠。