我遇到的错误(禁止您无权访问此服务器上的 /。)是新站点的根文件夹放错了位置,而不是文件系统问题。新站点实际上位于~/public_html_3.0/public_html/
,因为我解压错误。我放置的新符号链接public_html => public_html_3.0
现在指向没有索引文件的文件夹,因此出现错误。
替代解决方案
Leo Prince 的回答是正确的,但我将提供一个带有单命令开关的替代解决方案,它也适用于我(为像我这样的新手解释):
此解决方案要求您为服务器或此特定虚拟主机启用 FollowSymlinks,并假设您的虚拟主机指向 /home/user/public_html (~/public_html)。有关许可/所有权说明,请参阅已接受的答案。
让我们假设您的旧网站在 中,~/public_html
而您的新网站在~/app2
.
-public_html
-index.html
-other.html
-app2
-index.html
-other_new.html
首先,将旧站点复制到新目录:
# mkdir app1
# cp -a public_html/. app1/.
// -a option copies recursively with permissions/owners/groups
// but doesn't follow symbolic links
然后将 public_html 移动(重命名)到一个临时目录,然后创建一个从 public_html 到旧应用程序的符号链接。
# mv public_html public_html_bak
// moves the public_html "out of way"
# ln -s app1 public_html
// creates a symbolic-link
# ls -l
drwxr-x--- user nobody app1/
drwxr-x--- user nobody app2/
lrwxr-x--- user nobody public_html -> app1/
drwxr-x--- user nobody public_html_bak/
这使得 ~/public_html 指向 ~/app1。阅读有关符号链接的更多信息。服务器看到 public_html,但文件来自 app1。
如果它不起作用,请返回之前的状态:
# rm public_html
//// use rm, NOT rmdir, since it's a symlink, not a dir
# mv public_html_bak public_html
// return backup to previous location
如果它有效,当您希望切换到新站点 (app2) 时,您需要将符号链接更改为指向 app2 目录:
# rm public_html; ln -s app2 public_html
// remove existing link, create new link with a single line (instant change)
# ls -l
drwxr-x--- user nobody app1/
drwxr-x--- user nobody app2/
lrwxr-x--- user nobody public_html -> app2/
drwxr-x--- user nobody public_html_bak/
尽管这与连续重命名两个文件夹大致相同,但它可以清晰地查看应用程序版本,这正是我想要实现的目标:
# ls -l
drwxr-x--- user nobody app2.3/
drwxr-x--- user nobody app3.0/
drwxr-x--- user nobody app3.1/
drwxr-x--- user nobody app3.2b/
lrwxr-x--- user nobody public_html -> app3.0/ <- the current active version
# rm public_html; ln -s app3.1 public_html
/// a one-line switch to a different app version
/// first remove the symbolic link; then create new
当然,所有应用程序目录都必须具有适当的权限,如上面接受的答案中所述,并且目录的所有者:组必须与原始 public_html 相同。此外,符号链接必须属于具有相同权限的同一用户:组,以防您的服务器配置仅允许来自同一用户的符号链接。
请注意,要删除符号链接,您应该使用rm
,而不是rmdir
,因为如果您尝试删除实际目录,它将失败。
我还在学习 *NIX,所以这个解决方案可能存在一些我不知道的问题。但是对于频繁的版本更改,这就像魔术一样 :)