1

我一直在想这个问题,但是什么是确保在 Web 应用程序(RoR、Sinatra、PHP 等)中创建链接时(使用方法生成或写入)的最佳方法手)无论您是否位于域的根目录,它们都会转到正确的位置:http ://www.example.com/或http://www.example.com/this/is/where/the/应用程序/是/

我的想法是让最终用户在您的应用程序配置中的某处指定一个文档根目录,并使用它,但是我正在尝试一种很好的方法来做到这一点,而无需最终用户进行任何配置。

编辑:最终用户是指在服务器上设置应用程序的人。

编辑:我可以使用开头的“/”来始终获取相对于域的链接,但问题是如果应用程序本身不在根目录下,而是像http://www.example.com/this这样的地方/is/where/the/app/is/所以我想说gen_link('/')并让它返回/this/is/where/the/app/is/gen_link('/some/thing')返回/this/is/where/the/app/is/some/thing

4

4 回答 4

3

尝试base在 html 布局的头部设置元素怎么样?
首先,获取 URL,例如。以 Ilya 建议的方式(如果 PHP 适合您)。之后,您可以base按如下方式使用标签:

<base href="<?= $full_site_url ?>" />

这将为所有链接设置默认 URL,并且浏览器会将其添加到页面上的每个相对链接。

于 2009-02-18T19:34:34.100 回答
1

首先,您需要通过某种 url re-writer 功能路由所有 url。

所以你不再这样做:

<a href="some/path/">Foo</a>

但取而代之的是:

<a href="<%= url_for('some/path') %>">Foo</a>

所有的网络框架都有这样的功能。虽然他们通常在那里做各种各样的魔法(与 MVC 控制器路径和视图有关),但在函数的末尾(从概念上)他们都在你的 url 前面加上一个“根”(例如"/this/is/where/the/app/is/"),以便允许您在应用程序中创建独立于硬编码基本路径的 url。

RoR 使用一个名为"relative_url_root".

Symfony (php) 使用一个配置指令,也称为"relative_url_root".

CakePHP 使用一个名为"WEBROOT_DIR".

在这些框架在 Apache 上运行的情况下,该值通常是动态计算的(如果您没有明确设置它)。在其他网络服务器上,环境变量通常不可用或不正确,因此无法一致地确定该值。

于 2009-02-18T15:49:07.980 回答
0

您可以自己确定所需的一切,无需配置。

这是一个 PHP 示例(假设 index.php 是您的脚本名称):

<?
  $folder_on_server = substr ($_SERVER['PHP_SELF'], 0, strpos ($_SERVER['PHP_SELF'], '/index.php'));
  $server_name = $_SERVER['SERVER_NAME'];
  if (80 != $_SERVER['SERVER_PORT']) {
    $server_name .= ':'. $_SERVER['SERVER_PORT'];
  }
  $full_site_url = 'http://'. $server_name . $folder_on_server;
?>

现在,您可以随时创建这样的链接:

<a href="<?= $full_site_url ?>/some/thing/">Something</a>

另见评论中的讨论。

于 2009-02-18T15:23:55.340 回答
0

ilya 的回答很好,但我认为更简单的方法是在所有链接之前加上前导“/”。这将确保它们始终相对于域的根:

<a href="/some/thing">Something</a> <!-- Always links to www.domain.com/some/thing -->
<a href="some/thing">Something</a> <!-- Acutal destination depends current path -->
于 2009-02-18T15:32:09.720 回答