将所有裸子文件夹重定向到 subfoldername/public/

将所有裸子文件夹重定向到 subfoldername/public/

我正在尝试将.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$2RewriteRule 图案确保它还将匹配对裸子目录的请求,不包括尾随斜杠,即/site1,而不是允许 mod_dir 首先发出到的重定向/site1/

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

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

正则表达式[^/]+仅匹配第一个路径段,即除第一个斜杠之外的所有内容。

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

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

您的原始指令存在一些问题...

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

相关内容