【问题标题】:Correct way to handle absolute URL's in Javascript/PHP?在 Javascript/PHP 中处理绝对 URL 的正确方法?
【发布时间】:2014-10-01 21:19:22
【问题描述】:

好的,所以我有一些与 URL 重写一起运行的 Javascript;因此,如果我使用相对 URL,它会从错误的位置加载内容。

例如我在 myfunctions.js 中有这个函数:

function loadXMLDoc(url,cfunc) {...

如果我从test.com/a/b/c 传入一个相对网址,它将加载相对于test.com/a/b/c 而不是test.com 的内容。

我显然可以使用绝对 URL 来解决这个问题,但我需要它同时在测试服务器和实时服务器上工作。

当前在 PHP 中我使用一个函数来获取基本 url 并将其替换为绝对 URL。

所以在 PHP 中我有:

//On the test server I run:
define('BASE_URL', 'http://localhost/location/to/www/root');

//And on the live server I run:
define('BASE_URL', 'http://www.test.com/');

然后我在我的 PHP 中使用它来绝对加载图像、css 等;这允许我在测试服务器和实时服务器上使用相同的代码。

我的问题是;这里的正确解决方案是什么?我是否应该使用类似于我的 PHP 的 Javascript 函数来形成绝对 URL?或者将这个 PHP 定义传递给 .js 文件是否可能/一个好主意?

甚至可能有一个重写标志,告诉浏览器忽略 url 中的相对位置,只从根 www 位置加载;但我在上面找不到任何东西。

有什么想法吗?

【问题讨论】:

  • 抓取当前url,修剪,添加a/b/c
  • @starvator: 把它修剪成什么?如果网站位于虚拟目录中,则根目录可能是 http://www.domain.com/approot/ :)
  • 也许你需要使用一个变量 $isLive = false;然后用 if($isLive) { define('base_url', 'url-live'); 检查它} else { 定义('base_url', 'url-test'); }
  • @TrueBlueAussie 真的吗?我在虚拟目录中有一个站点,当我抓取 url 时,它包含了 aspx 页面。奇怪
  • @starvator:我的意思是你会从网站根不在/的网址中修剪什么,例如http://www.domain.com/approot/somepage.aspx?

标签: javascript php jquery html url-rewriting


【解决方案1】:

只需在你的通用文件(header.php)中定义:-

<script> var baseUrl = '<?php echo BASE_URL;?>';</script>

并将您的所有 js 包含在此代码下方并访问此 var 以供使用。

【讨论】:

  • 好吧。我觉得很笨。 :p
【解决方案2】:

包含标签后,使用以下。但请记住,您将无法在 External 中使用该变量

<script> 
    var siteBaseURL = '<?php echo BASE_URL;?>';
</script>

因为,PHP 将 ECHO 任何服务器端值并将其作为 HTML 发送,因此 PHP 将发送 BASE_URL 并且此类带有 JavaSCRIPT 的 HTML 将包含在浏览器中。

但是在任何外部 JS 文件中,比如说

 <script src="example.js"/>  Here you wont be able to access the above variable.

【讨论】:

  • 关于您的第二条评论:如果变量是在全局命名空间中声明的,您将能够从任何带有window.siteBaseURL 的脚本访问它。
  • @TrueBlueAussie,是的,没错。我不得不说,如果他将其定义为特定于范围,那么就会出现问题
  • 我认为只是它的措辞让我感到困惑:)
【解决方案3】:

每当我在测试和实时开发时,我只使用“/css/location/cssfile.css”(这适用于任何文件),这样我就不必修改任何东西。

然后当我的 HTML 加载时,它会从正确的位置调用。以上翻译为:

http://localhost/location/to/www/root/css/location/cssfile.css

http://test.com/css/location/cssfile.css

这将适用于 50 个网站:

/css/location/file.name

适用于:

http://localhost/location/to/www/root
http://localhost/location/to/www/testsite1
http://localhost/location/to/www/testsite2
http://localhost/location/to/www/testsite3

【讨论】:

  • 问题是我的测试服务器上运行了几十个网站;所以 www 不能设置为特定的网站。 :-(
  • 你不必这样做。就像我说的,使用“/where/my/file/is”而不是完整的绝对路径。您可以为每个网站进行开发,而无需实际对其进行硬编码!
  • 是的,但是测试服务器上的www目录与现场网站不同?所以它不会从同一个位置加载?
  • 没关系。如果你使用 /where/you/want/to/go/file.name 那么你的根目录在哪里都没有关系。
  • A root relative 路径(例如您的示例)将始终映射回域根。那是在浏览器控制之下。我不知道您将如何获得您提到的http://localhost/location/to/www/root/css/location/cssfile.css 结果。你更有可能得到http://localhost/css/location/cssfile.css
猜你喜欢
  • 1970-01-01
  • 2015-04-20
  • 2012-08-21
  • 1970-01-01
  • 2020-02-22
  • 2020-11-15
  • 2012-09-30
  • 2012-04-19
  • 2021-09-23
相关资源
最近更新 更多