我正在尝试做一个.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开始处的第一个斜杠。