Лучший способ/практика обеспечить размещение ссылок в правильном месте, если они не находятся в корне домена?
-
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>
Смотрите также обсуждение в комментариях.