我怎样才能找到网站的代码所在位置?

事实如下:
  • 有一个网站
  • 这个网站可以通过www.example.org访问
  • 有一个EC2实例很可能保存着这个网站
  • 服务器是Apache
  • 服务器操作系统是Ubuntu
  • 我对服务器拥有完全访问权限(以及sudo特权)
  • 服务器非常混乱
问题是,我不知道在哪里找到被加载的index.html/index.php文件。 我该如何找到网站的PHP和HTML代码?有没有一种系统化的方法来解决这个问题?

你知道域名吗? - the_velour_fog
9是的,我在第二个要点中表明了它。 - Raffael
在网站上查找/命名为“somefileonthewebsite.html”的文件。 - user253751
6个回答

首先,你应该检查服务器上托管的网站有哪些。
# apachectl -t -D DUMP_VHOSTS
当你找到一个网站时,检查相应的配置文件以查找选项DocumentRoot。例如:
# apachectl -t -D DUMP_VHOSTS
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
         default server 192.168.88.87 (/etc/httpd/conf.d/192.168.88.87.conf:1)
         port 80 namevhost 192.168.88.87 (/etc/httpd/conf.d/192.168.88.87.conf:1)
         port 80 namevhost gl-hooks.example.net (/etc/httpd/conf.d/hooks.conf:1)
                 alias example.net
                 alias www.example.net
你想知道网站example.net的所在位置。
# grep DocumentRoot /etc/httpd/conf.d/hooks.conf
    DocumentRoot /vhosts/gl-hooks.example.net/

# cd /vhosts/gl-hooks.example.net/
# ls -la
total 4484
drwxr-xr-x  6 apache apache    4096 Feb 10 11:59 .
drwxr-xr-x 14 root   root      4096 Feb 23 08:54 ..
-rw-r--r--  1 root   root      1078 Dec 19 09:31 favicon.ico
-rw-r--r--  1 apache apache     195 Dec 25 14:51 .htaccess
-rw-r--r--  1 apache apache      98 Dec  7 10:52 index.html
你还应该注意别名和重定向/重写。例如,使用以下设置:
<VirtualHost *:80>
   ServerName example.net
   ServerAlias www.example.net
   ...
   DocumentRoot /vhosts/default/public_html/
   Alias /api/ /vhosts/default/public_api/
   ...
</VirtualHost>
当你访问http://example.net/some.file.html时,Apache会在/vhosts/default/public_html/目录下查找文件,而当你访问http://example.net/api/some.file.html时,文件将在/vhosts/default/public_api/目录下查找。 至于重写/重定向,特别是程序化的情况(当重定向由某些PHP代码触发时),我认为没有简单的方法来找到这样的情况。

3还应该密切注意别名和重定向/重写。 - Bob

尝试使用查找功能
find / -type f \( -iname "*index.html*" -o -iname "*index.php*" \) 2> /dev/null
否则假设Apache已从Ubuntu存储库安装,请查看/etc/apache2/sites-available目录。
grep -niR "thedomainname" /etc/apache2/sites-available
如果网站定义了apache VHOST,那么可能会找到配置文件,然后在该文件中查找"documentroot",这将告诉您源代码的位置。

1嗯...我“做”了那个 - 花了2个小时,服务器几乎停止响应了,我找到了67个index.html文件和差不多一样多的index.php文件。所以这种方法对我来说行不通。 - Raffael
2在这种情况下使用find是一个非常糟糕的主意。 - ALex_hha
1你最好使用 sites-enabled - ALex_hha
1index.html不是一个很好的文件来查找。有一些CMS在每个目录中都放置了一个index.html文件,以防止Apache未关闭目录列表功能,这样它将始终加载一个空白页面而不显示目录内容。 - gabe3886
@the_velour_fog 不是说这里非常关键,但是-type f只适用于你命令中的-iname "*index.html*"。应该改为-type f \( -iname "*index.html*" -o -name "*index.php*" \) - user341384
@BroSlow,谢谢你指出这个问题,我已经更新了回答。 - the_velour_fog

另一种方法,可以用于调试网站(或任何进程),是使用 lsof(可能不在路径上,通常位于 /sbin/lsof

lsof -s [PID] 将列出给定进程拥有句柄的所有文件,并且可以用于查看正在使用的准确内容(包括您的 HTML/PHP 文件,以及站点所需的日志文件和库文件)


请前往 cd /etc/apache2/site-avaliable/ 在这里您将找到您的配置文件(例如:000-default.conf) 请打开此文件/打开您的配置文件 使用vi 000-default.conf 在那里您将找到DocumentRoot。那是您网站的代码 这是默认的conf文件,同样您还会找到一些其他的conf细节,请检查它们。

3这取决于系统。 - Lightness Races in Orbit
除了@PreferenceBean的评论之外,这将仅显示默认虚拟主机的配置。可能有许多具有无用名称的虚拟主机,也可能需要进行检查。 - gabe3886

我不知道在哪里找到被加载的index.html/index.php文件。 寻找页面源文件 一种方法是浏览网站,找到一个更独特的页面 - 比如newcontactform.php - 最好是一个不太可能出现在同一服务器上托管的其他网站中的页面。 然后你可以尝试
locate newcontactform.php
如果那不起作用,然后跟着做。
find / -name newcontactform.php
这应该会产生一个可管理的候选人名单。 然后,您可以检查文件,进行差异比较,如果有必要,尝试进行小的更改(例如插入HTML注释)以验证文件确实生成页面。 找到配置文件 有时,配置文件在ps命令的输出中是明显的。最糟糕的情况是ps -ef | grep -e 'apache|httpd',但更有创意地使用ps选项可能值得探索。 您可以在Ubuntu和Apache httpd项目(可能不同)的典型位置中寻找httpd.conf,或者只需像上面那样使用locatefind。 有时,主配置文件会引用其他虚拟主机的配置文件。您可以通过识别主配置文件来解决这个问题。 慢性病例 有时,旧服务器运行各种Web服务器守护程序。在这种情况下,找到它们并确定它们的配置文件所在位置可能需要一些时间。上述技术的组合最终应该能够成功。 你可以使用netstat -lntp命令来查找监听在端口80上的程序等。通常,定位二进制文件是一个有用的指示器,可以指向包含配置文件的目录树。

你可以在网页服务器(apache)的配置文件httpd.conf中检查你要查找的域名的虚拟主机(Vhost)(很可能位于/etc/目录下)。 只需打开该文件并浏览,直到找到你的域名的VirtulaHost指令,那里你将看到DocumentRoot指令 - 这是你的网站文档根目录,也就是应用程序文件所在的位置。