将站点根目录别名为子目录

将站点根目录别名为子目录

我有一个通过 Apache 提供服务的网站,我想稍微修改一下目录结构。
我现在的情况是这样的:

/var
    /www
        /html
             index.html
             ...files for root...
             /sub-directory1
                       index.html
             /sub-directory2
                       index.html

我想转到以下结构,同时保留内容/main作为我的网站根目录:

/var
    /www
        /html
             /main
                       index.html
                       ...files for root...
             /sub-directory1
                       index.html
             /sub-directory2
                       index.html

我想到的东西对我来说似乎有点奇怪,所以我想听听更多有经验的意见:

<VirtualHost *:80>
  DocumentRoot /var/www/html
  ServerName X.Y.Z

  Alias "/" "/var/www/html/main"
</VirtualHost>

但这意味着/main也可以在不上网的情况下观看/...

另一个选择是使用重写规则:

<VirtualHost *:80>
  DocumentRoot /var/www/html
  ServerName X.Y.Z

  RewriteEngine On
  RewriteRule ^/|(/main)$ /main/ [R=301,L]
</VirtualHost>

任何有关此事的意见都将受到赞赏。

答案1

你可以用mod_rewrite。具体条件取决于您想要实现的效果。我假设您想要:

  1. 如果sub-directory文档根目录中存在一个目录,您希望提供以http://example.com/sub-directory该目录开头的所有 URL。
  2. 否则,您想要提供目录中的内容,即将忽略main其中的所有常规文件。/var/www/html
  3. 以 开头的 URLhttp://example.com/main将会出现404错误。

上述条件可以通过以下重写规则来满足:

RewriteEngine on
# Empty condition, we just want to capture the first path component.
RewriteCond %{REQUEST_URI}     ^(/[^/]*)
# The empty path '/' and those starting with '/main'
RewriteCond %1                 ^/(main)?$ [OR]
# together with every path, whose first component is not a directory
# (e.g. '/index.html', '/favicon.ico')
RewriteCond %{DOCUMENT_ROOT}%1 !-d

# will be prepended with '/main'.
RewriteRule ^ /main%{REQUEST_URI}
# For 'http://example.com/main' it means that the server will look for
# '/var/www/html/main/main' and return a 404 error.

相关内容