Безопасный способ записи 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-адреса, чтобы при выполнении развертывания я мог выполнять как можно меньше работы?

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

Например:

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

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

вам не нужен абсолютный 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'; 

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

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

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

  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 

Используйте всегда относительные 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

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

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