Лучший способ/практика обеспечить размещение ссылок в правильном месте, если они не находятся в корне домена?

StackOverflow https://stackoverflow.com/questions/561443

  •  05-09-2019
  •  | 
  •  

Вопрос

Я уже давно задавался этим вопросом, но как лучше всего гарантировать, что в веб-приложении (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

Это было полезно?

Решение

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

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

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

Другие советы

Прежде всего вам нужно направить все ваши URL-адреса через какую-то функцию перезаписи 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, это значение часто рассчитывается динамически (если вы не установили его явно).На других веб-серверах переменные среды часто недоступны или неверны, поэтому это значение невозможно определить последовательно.

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

<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 -->

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top