服务器IP无法进行站点测试

时间:2015-08-28 15:23:54

标签: php linux apache server

我最近刚从godaddy购买了一个Linux托管服务器。我不知道我是否搞砸了什么或者我只是在做菜,我似乎无法使用IP XXX.XX.XX.XX来测试网站。研究了一下后,我发现我可以使用XXX.XX.XX.XX/~rootuser/

进行预览

由于我试图从同一台服务器运行多个站点,因此所有站点都根据目录分开。

XXX.XX.XX.XX/~rootuser/site这会加载网站。

我的php中的所有链接都使用$_SERVER['SERVER_NAME']的常量值作为url。但是所有链接在开发工具中同样显示为XXX.XX.XX.XX/script.js

我虽然使用Apache但找不到蚂蚁有用的话题。我也尝试过使用hosts文件,但最终失败了。

我真的非常喜欢这个,真的在我的智慧结束。并且真的不喜欢使用不好的术语。

有没有办法在ip之后使用ip而不使用/~rootuser/或者让php获取XXX.XX.XX.XX/~rootuser/site作为服务器名称。

修改

使用IP即使我删除hello.html http://prntscr.com/89wx25

,也会显示此信息

3 个答案:

答案 0 :(得分:1)

如果您拥有vps或专用服务器,则只能使用ip,因为它们只有您的托管专用IP。

如果你在你的ip上购买了共享主机,那么很多网站都是托管的,所以你不能做你想做的事。

答案 1 :(得分:1)

我会尽力回答你的两个问题......

a)"在ip [?]"

之后,是否有办法使用ip而不使用/~roonuser /

独立于GoDaddy,当然可以。必须将服务器(例如,Apache)配置为为该IP地址服务该网站。但是,从逻辑上讲,您无法通过这种方式为每个IP提供多个网站。这是不切实际的,这也是您想要使用映射到该IP的多个名称的一个原因。)

对于GoDaddy来说,这一切都取决于你购买的包装是什么类型的#34;以及它允许​​你做什么。如果您有专用IP,也许您可​​以要求它为该IP的特定网站提供服务,但您可能会购买共享主机方案,因此相同的IP用于多个用户/客户/站点。因此,他们不会将IP默认为您的网站。所以我建议你在实践中依赖一个名字。该名称通常是您注册的域名,例如EXAMPLE.COM。

从技术上讲,如果您掌握了机器配置(GoDaddy上没有机会,特别是如果您购买了共享主机方案),您甚至可以告诉机器为您的网站服务" anynameyouchoose"在本地(即在您自己的计算机上),您可以确保它映射" anynameyouchoose"到目标主机IP XXX.XX.XX.XX.在Linux和Windows中,有一个hosts文件,您可以在其中指定名称和IP之间的映射。如果需要,您甚至可以决定将Microsoft.com解析为XXX.XX.XX.XX,如果位于XXX.XX.XX.XX的计算机配置为为Microsoft.com提供特定内容,它将会!

在实践中,有一些公共名称服务器可以将像Microsoft.com这样的域映射到已注册的IP,但是知道它是如何工作的很好,当你想在4月1日愚弄朋友时它可能会派上用场。 ; - )

这有点高级,但是如果你理解我刚刚说的话,你也可以尝试将主机控制面板中的任何组成域名与你的站点内容相关联,然后将该名称映射到机器的IP你的网站是。它可能会起作用,但这完全取决于GoDaddy或您将使用的任何主机允许您这样做。

我认为GoDaddy目前为您的托管计划提供免费域名注册,或者您至少可以购买一个(我确定您打算购买一个或多个)。一些主机(我不知道GoDaddy)也为他们的用户提供了一些通用子域(your-site-name.godaddy.com - 其中GoDaddy.com可以是主机用作其用户的基本域的任何东西)。这也可以为您提供根主机名,而无需处理深根路径。

如果您有多个网站,您还可以只购买一个域名并创建大量子域以映射到您的每个网站。就像你购买EXAMPLE.COM一样,你可以创建SITE1.EXAMPLE.COM,SITE2.EXAMPLE.COM等。

如果您绝对想避免在代码中处理变量根路径,那就完全了。

b)" [...]或让php获取XXX.XX.XX.XX / ~rootuser / site作为服务器名称[?]"

如果要执行此操作,在PHP中,您可能需要设置一些配置变量来保存主机(IP或名称)和根路径(例如/ ~rootuser / site)。因此,即使您在具有不同约束的多个主机上运行站点,也会限制必须更改为配置变量的代码量。您可以尝试覆盖$ _SERVER [' SERVER_NAME']值,但我建议不要这样做,因为这不是此特殊变量的目的,并且会在未来产生更多问题。

URL的其他部分可以根据主机(如协议(http或https)和端口号)进行更改。如果您发现必须在代码中重复过多,请创建自己可以重复使用的变量或函数。

如果你想自动管理这个,你需要查看$ _SERVER super global的这些索引:

  • HTTP_HOST :这将为您提供在浏览器地址栏中输入的主机IP或名称。
  • REQUEST_URI :这将为您提供HOSTNAME之后的所有内容(路径+查询字符串)

因此,对于地址http://www.example.com/~root/site1/sub-directory/page?var1=abc&var2=def,值将为:

  • $ _ SERVER [' HTTP_HOST'] => www.example.com
  • $ _ SERVER [' REQUEST_URI'] => /〜根/ SITE1 /子目录/页VAR1 = ABC&安培; VAR2 = DEF

您可以在那里了解$ _SERVER中通常可用的内容:http://php.net/reserved.variables.server

请注意,$ _SERVER中的某些变量可能只适用于某些服务器(Apache,IIS等)。但现在不要担心这个问题。大多数人倾向于使用Apache和PHP,并且您希望使用的常用服务器变量应该可以在所有流行的服务器中使用。

当然,如果您使用我的示例中的子目录,您将无法轻松找出您的"根路径" (即/ ~root / site1)。因此,除了为每个设置手动配置它之外别无选择。

我还鼓励您利用函数phpinfo()。使用以下代码创建名为info.php的页面:

<?php
phpinfo();

当您访问该页面时,您将看到$ _SERVER中提供的所有内容,以及许多其他有用的信息。例如,如果您访问http://hostname/the/path/to/info.php?var1=abc&var2=def - 您将在哪些变量中看到查询字符串&#34; var1 = abc&amp; var2 = def&#34;包括在内。

您可能想要创建一个默认配置文件(config.php),该文件可选地包含一个用于&#34;覆盖&#34;的文件。如果需要,默认值(config.env.php):

config.php可以是:

<?php
$config['host'] = $_SERVER['HTTP_HOST'];
$config['path'] = '/';

if (file_exists('config.env.php')) {
    require('config.env.php');
}
?>
然后,GoDaddy帐户上的

config.env.php可以是:

<?php
$config['path'] = '/rootuser/site1';
?>

此config.env.php文件将改变同一站点的多个设置。例如,您可以进行&#34;开发&#34;本地版本,&#34;测试&#34; /&#34; staging&#34;版本在线和&#34;生产&#34;版本在线。每个环境都可以有自己的特定配置。

然后,您需要在所有页面中包含config.php,以便配置变量可用。

此外,在您的页面中,您可以构建所有内部链接(链接在同一站点内),而无需指定协议,主机和端口。因此,这些链接将相对于主机&#34;而言。因此,如果您链​​接到&#34; / ~rootuser / site / sub-directory / page-name&#34;,您将不需要指定&#34; http://host:port&#34;,它会使用实际的。当你不必要时,为什么要重复自己,添加更多角色等? ; - )

我还建议您始终对所有内部链接使用绝对路径(即以/开头),而不是试图放置相对路径。例如,使用&#34; / section-x / sub-y / page-z&#34;而不是使用&#34; sub-y / page-z&#34;位于&#34; http://host/section-x/index&#34;)的页面中。除非你真的有充分的理由并且知道你做了什么,否则这通常会让你自己更难以管理。

当然,如果您无需在所有环境中拥有可变的根路径,那么这将简化您的代码库。

我还想提一下,HTML标签允许您为网页中的所有链接定义基本路径。但是,您必须正确理解它是如何工作的。如果你对此感到好奇,我建议你去检查一下:Is it recommended to use the <base> html tag? - 这不是我建议你做的,但知道它存在是很好的。

如果还没有完成,你也应该为自己设置一个本地开发环境(WAMP或LAMP包可以帮助你快速启动;如果你在Windows上,请查找WampServer。)

我希望这很清楚,这会让你更好地理解整个事情。否则,请随时提出问题,以便我提高答案。

答案 2 :(得分:0)

因为许多域名可以指向相同的IP地址(字面意思是,几乎无限数量的域都可以指向相同的IP),Apache和其他Web服务器都有配置来查找名称并找到正确的位置去显示网站。

在Apache中,它是一个名为“VirtualHost”块的配置。这是我自己托管的网站的简化/样本。

<VirtualHost *:80>
    # we don't list a specific IP here - so it would accept a connection
    # from any the machine has. The ServerName is the important part here.
    ServerAdmin webmaster@example.net
    ServerName portal.example.net
    # If this was the only VirtualHost set, or it was setup first in the
    # configuration, it would catch all websites on this IP, unless
    # another Vhost was defined for a name. Ordering is important though.

    DocumentRoot /var/www/sites/portal.net/html/
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/portal.error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn
    CustomLog ${APACHE_LOG_DIR}/portal.access.log combined

</VirtualHost>

在这个例子中,我转到一个网站URL:portal.example.net(不是一个真实的网站,只是一个例子),在名称指向的IP地址上,网络服务器看到浏览器给出的名称 - 它在Host:标题中,从配置中查找该块,然后在光盘上找到正确的位置 - /var/www/sites/portal.me/html/显示该网站。

如果您在计算机上运行多个网站,则需要在Apache,Nginx或您想要查看的任何网站上使用类似的内容。如果您只运行一个网站,那么您可以将所有内容默认为指向相同的位置 - 但无论如何都有充分的理由以更好的方式执行此操作。

Apache VirtualHost文件需要位于主Apache配置中 - 它们往往位于名为/etc/apache/site-enabled/200-websitename.conf的文件中。这些数字有助于在目录中专门订购文件。还有一个目录/etc/apache/site-available/,其中可以放置文件,然后符号链接到-enabled目录,如果这些站点偶尔会被禁用。