Безопасный способ записи URL-адресов, переносящих разные среды

В настоящее время я разрабатываю программное обеспечение на своей локальной машине. Ради этого вопроса позвоните по программному обеспечению StackOverflow. У меня есть следующие страницы

C:\sites\StackOverflow\index.php
C:\sites\StackOverflow\content\page1.php
C:\sites\StackOverflow\content\page2.php
C:\sites\StackOverflow\content\page3.php

В моей текущей среде выполнение http://localhost/StackOverflow/index.php работает успешно. И URL, который я написал для страниц контента, будет похож на http://localhost/StackOverflow/content/page1.php.

Когда я развертываю это для производства, URL-адрес больше не будет локальным хостом, а скорее IP-адресом или именем хоста, которое еще не определено. Как я должен писать свои URL-адреса, чтобы при выполнении развертывания я мог выполнять как можно меньше работы?

Ответ 1

Запустите их относительно корня: /.

Например:

/StackOverflow/index.php
/StackOverflow/content/page1.php
/StackOverflow/content/page2.php
/StackOverflow/content/page3.php

Они автоматически будут префикс текущего домена или того, что вы установили как <base>.

Ответ 2

вам не нужен абсолютный http-путь, это действительно проблематично, если вы используете HTTPS, поскольку либо одна из тех ссылок, которые все еще указывают на HTTP, потенциально может привести к тому, что браузеры будут показывать ошибку "небезопасного контента"

// This allows you to deploy to different enviroments where some might
// have the page _not_ in the site root, without having to edit
// 1000s of lines of code.
$config['baseurl'] = '/StackOverflow';

// then when you echo an url you can just
echo $config['baseurl'] . '/content/page1.php';

Ответ 3

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

Относительно обычно начинается ваше текущее местоположение файла. Обычно у меня есть index.php, включая другие файлы. Итак, все это относительно корневого местоположения:

./ means same path
./test/ means one level up
../ means 1 level-below
../../ means 2 levels-below etc

См

http://www.webdevelopersnotes.com/design/relative_and_absolute_urls.php3

Ответ 4

Обычно я настраиваю переменную $baseurl и $basepath в файле конфигурации приложения, указывающем на корневой каталог приложения, и в моем интерфейсе я просто префикс моих URL-адресов с этими переменными.

Таким образом вы можете легко переносить свой сайт с одного сервера на другой, а также работать с приложениями в подкаталогах

Ответ 5

Если вы хотите динамически, вы можете сделать это следующим образом:

$pathInfo = pathinfo($_SERVER['SCRIPT_NAME']);
$baseUrl = rtrim($pathInfo['dirname'], "\\/");

Я сохраняю этот baseUrl в моем объекте запроса и использую его в сценариях просмотра. Это зависит от вас.

Используйте его следующим образом:

<a href="<?php echo $baseUrl; ?>/content/page1.php">Test</a>

Иногда вам нужен абсолютный URL-адрес, если вы отправляете электронное письмо, например, и вам нужно связать его с сайтом:

$rootUrl = 'http';
if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') {
    $rootUrl .= 's';
}
$rootUrl .= '://'.$_SERVER['SERVER_NAME'];
if ($_SERVER['SERVER_PORT'] != '80') {
    $rootUrl .= ':'.$_SERVER['SERVER_PORT'];
}
$rootUrl .= $baseUrl;

Используйте $rootUrl так же, как $baseUrl.

Ответ 6

Я всегда назначаю пару констант в файле конфигурации и основываю все свои пути.

 if ($_SERVER["APP_ENVIRONMENT"] == "development"){
   define("BASE_PATH", "C:/sites/StackOverflow/development/");
   define("BASE_URL", "/development/");
 } else {
   define ("BASE_PATH", "/home/www.mysite.com/htdocs/");
   define ("BASE_URL", "/");
 }

Затем, когда я делаю url, я создаю путь, подобный

 $url = BASE_URL."path/to/whatever.jpg";

И для ссылок на файлы

 include (BASE_PATH."libraries/mylib.php");

Вы можете установить $_SERVER [ "APP_ENVIRONMENT" ] в htaccess для каждого окружения, используя PutEnv

SetEnv APP_ENVIRONMENT development