Лучший способ / практика, чтобы убедиться, что ссылки идут в нужное место, когда нет в корне домена? - PullRequest
1 голос
/ 18 февраля 2009

Мне уже давно интересно это, но как лучше всего убедиться в том, что в веб-приложении (RoR, Sinatra, PHP, что угодно), когда вы создаете ссылки (либо генерацию с помощью метода, либо записывая от руки), что они отправляются в нужное место независимо от того, находитесь ли вы в корне домена или нет: http://www.example.com/ или http://www.example.com/this/is/where/the/app/is/

Я думаю, что конечный пользователь должен указать корневой каталог документа в конфигурации вашего приложения и использовать его, однако я пытаюсь придумать хороший способ сделать это без настройки конечного пользователя. что-нибудь.

Редактировать: под конечным пользователем я имею в виду человека, устанавливающего приложение на сервере.

Редактировать: я могу использовать начало '/', чтобы всегда получать ссылку относительно домена, но проблема в том, что если само приложение находится не в корне, а в каком-то месте, например 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 ]

3 голосов
/ 18 февраля 2009

Как насчет попытки установить элемент base в заголовке HTML-макета?
Сначала получите URL, например. В некотором смысле, Илья предлагает (если PHP для вас в порядке). После этого вы можете использовать тег base следующим образом:

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

Это установит URL-адрес по умолчанию для всех ссылок, а браузер добавит его к каждой относительной ссылке на странице.

1 голос
/ 18 февраля 2009

Прежде всего вам нужно направить все ваши URL через какую-то функцию переписывания URL.

Итак, вы больше не делаете:

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

Но вместо этого что-то вроде:

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

У всех веб-фреймворков есть такая функция. В то время как они обычно делают там все виды магии (для работы с путями и представлениями контроллера MVC, а что нет), в конце функции (концептуально) они все добавляют к вашему URL "root" (например, "/this/is/where/the/app/is/") чтобы вы могли создавать в приложении URL-адреса, которые не зависят от жестко заданного базового пути.

RoR использует директиву конфигурации под названием "relative_url_root".

Symfony (php) использует директиву конфигурации, также называемую "relative_url_root".

CakePHP использует директиву конфигурации под названием "WEBROOT_DIR".

В тех случаях, когда эти платформы работают на Apache, это значение часто вычисляется динамически (если вы не установили его явно). На других веб-серверах переменные среды часто недоступны или являются неверными, поэтому это значение нельзя определить последовательно.

0 голосов
/ 18 февраля 2009

Илья - хороший ответ, но я думаю, что более простой способ сделать это - просто поставить перед всеми ссылками начальный символ "/". Это гарантирует, что они всегда относительно корня домена:

<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 -->
0 голосов
/ 18 февраля 2009

Вы можете сами определить все, что вам нужно, без конфигов.

Вот пример 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>

См. Также обсуждение в комментариях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...