所以我以前从未见过这种情况。我有一个使用 Debian Linux 和 Apache 2.2 的 EC2 服务器(第一次设置)。使用这样的路径/js/file.js
正在寻找http://js/file.js
. 在我的本地机器和我的 Dreamhost 共享服务器上,我没有这个问题。事实上,我以前从未在服务器上看到过这个问题。它应该做的是寻找http://domain.com/js/file.js
. 有谁知道为什么会发生这种情况?我已经倾注了我的 php.ini 文件并且没有任何提示我应该更改或添加什么来解决这个问题。
2 回答
你在你的 php.ini 文件上“倒”了什么样的糖浆?它可能把作品搞砸了!;)
您是否通过浏览器(查看 > 页面源代码)查看了输出 HTML,您得到的是http://js/file.js
什么?是src="http://js/file.js"
在标签里吗?添加http://domain.com/
应该是浏览器的工作,而不是服务器。一些浏览器会显示已添加域的 URL,而另一些浏览器则会准确显示您发送到页面的内容。您是否发送任何可能缺少域的标签?我认为它只应该适用于相对URI,但值得检查。您实际上使用的是 js/file.js 还是 /js/file.js?他们非常不同。
好的,所以我想通了。问题是在我的本地机器和我的其他服务器上我不在根域,所以我$_SERVER['SCRIPT_NAME'].DIRECTORY_SEPARATOR."js/"
用来确定根 url 来为 js 文件路径创建别名。这回来了/app/js/
。当文件位于某个域的子文件夹中时,这很好用,例如domain.com/app/js/file.js
.
但是,一旦我在我的服务器上安装了这个应用程序,它就是根应用程序$_SERVER['SCRIPT_NAME'].DIRECTORY_SEPARATOR."js/"
正在返回//js/
。这就是问题所在!那不一样/js/
。那是绕过域作为 url 的一部分,而是告诉浏览器看起来http://js
像是一个完全限定的 url。我假设//
这是http://
虽然我以前从未尝试过的简写。
为了解决这个问题,我根据 Yii 框架中的某些内容将这个函数组合在一起,这就是我在这个应用程序中使用的。
function getBaseUrl() {
$scriptName=basename($_SERVER['SCRIPT_FILENAME']);
if(basename($_SERVER['SCRIPT_NAME'])===$scriptName)
$_scriptUrl=$_SERVER['SCRIPT_NAME'];
else if(basename($_SERVER['PHP_SELF'])===$scriptName)
$_scriptUrl=$_SERVER['PHP_SELF'];
else if(isset($_SERVER['ORIG_SCRIPT_NAME']) && basename($_SERVER['ORIG_SCRIPT_NAME'])===$scriptName)
$_scriptUrl=$_SERVER['ORIG_SCRIPT_NAME'];
else if(($pos=strpos($_SERVER['PHP_SELF'],'/'.$scriptName))!==false)
$_scriptUrl=substr($_SERVER['SCRIPT_NAME'],0,$pos).'/'.$scriptName;
else if(isset($_SERVER['DOCUMENT_ROOT']) && strpos($_SERVER['SCRIPT_FILENAME'],$_SERVER['DOCUMENT_ROOT'])===0)
$_scriptUrl=str_replace('\\','/',str_replace($_SERVER['DOCUMENT_ROOT'],'',$_SERVER['SCRIPT_FILENAME']));
else
throw new Exception('The App is unable to determine the entry script URL.'));
return rtrim(dirname($_scriptUrl), '\\/');
}
我希望这对其他人有帮助。