我有一个通过 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。具体条件取决于您想要实现的效果。我假设您想要:
- 如果
sub-directory
文档根目录中存在一个目录,您希望提供以http://example.com/sub-directory
该目录开头的所有 URL。 - 否则,您想要提供目录中的内容,即将忽略
main
其中的所有常规文件。/var/www/html
- 以 开头的 URL
http://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.