我正在尝试将.htaccess
所有顶级子文件夹重定向/重写到一个子文件夹。
例如,我的目录结构如下
/public_html
/site1
/public
/site2
/public
/site3
/public
我希望任何人都可以example.com/site1/
从中获得文件example.com/site1/public
,但我不希望显示 URL public
。
以下是我尝试过的:
RewriteEngine On
#RewriteRule /(.?)/ /$1/public/ [L]
答案1
在您的根文件中尝试如下操作.htaccess
:
RewriteEngine On
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^(site1|site2|site3)/?(.*) /$1/public/$2 [L]
这将针对任何 URL开始 /site1
或(请注意,模式中/site2
不包括斜杠前缀)。然后使用和反向引用在内部重写从到的请求。/site3
.htaccess
/site1/<whatever>
/site1/public/<whatever>
$1
$2
RewriteRule
图案确保它还将匹配对裸子目录的请求,不包括尾随斜杠,即/site1
,而不是允许 mod_dir 首先发出到的重定向/site1/
。
重写任何根目录(不仅限于site1
、site2
等),然后将RewriteRule
指令更改为:
RewriteRule ^([^/]+)/?(.*) /$1/public/$2 [L]
正则表达式[^/]+
仅匹配第一个路径段,即除第一个斜杠之外的所有内容。
RewriteCond
检查环境变量的指令确保REDIRECT_STATUS
我们不会得到重写循环。REDIRECT_STATUS
在第一次调用脚本时未设置,而是设置为第一次重写时的 HTTP 状态(或错误状态)。
#RewriteRule /(.?)/ /$1/public/ [L]
您的原始指令存在一些问题...
.?
仅捕获最多一个字符 - 您已将其设为可选。/(.?)/
将会匹配任何地方在请求的 URL 中(而不是开头)。但请注意,在.htaccess
/directory 上下文中,您无论如何都无法匹配 URL 路径开头的第一个斜杠(如上所述)。- 您没有捕获 URL 路径的其余部分,因此无论请求的 URL 是什么,这都只会重写到文档根目录。
- 这将触发重写循环。(导致 500 内部服务器错误。)