@Gesparo
Fullstack разработчик

Как изменять содержимое в зависимости от доменного имени?

Доброго времени суток.

Задача у меня следующая. На моем аккаунте на хостинге расположены сайты, содержимое которых похоже друг на друга, но различается реквизитами и небольшими изменениями в тексте, в зависимости от региона в котором эти сайты продвигаются. Например:

москва.site.com
перербург.site.com
новосибирск.site.com

И соответственно я бы хотел, чтобы всеми этими сайтами управлял один фреймворк/CMS.

Мои предположения:

Хостинг(например beget) предоставляет возможность подключать несколько доменов к одному сайту. И я бы хотел воспользоваться этой возможностью и в зависимости от того, по какому доменному имени перешел пользователь, отображать ему соответствующий сайт. Как я понимаю, этот вопрос можно решить при помощи анализа переменной $_SERVER['SERVER_NAME']

Подскажите пожалуйста, правильное ли это решение и нет ли тут подводных камней?
И как быть с файлами, такими как robots.txt, sitemap.xml или favicon.ico? Для каждого сайта они могут быть разными. И нужно их правильно подменить. Иначе, если это проигнорировать, то у всех сайтов будет один и тот же файл.
  • Вопрос задан
  • 225 просмотров
Решения вопроса 1
@Gesparo Автор вопроса
Fullstack разработчик
Переменная
$_SERVER['HTTP_HOST']
вполне успешно решает эту задачу.

Вот пример моего решения, которое работает без нареканий:

TargetUrlParser.php
namespace App\Url;


class TargetUrlParser
{
  /**
   * Get target url
   *
   * @return string
   */
  public static function getUrl()
  {
    return (string) $_SERVER['HTTP_HOST'];
  }
}

HomePageController.php
class HomePageController extends Controller
{
  /**
   * @var Site
   */
  private $site = null;

  /**
   * @var SiteSettings
   */
  private $siteSettings = null;

  /**
   * HomePageController constructor.
   */
  public function __construct()
  {
    $this->site = Site::where('http_host', '=', TargetUrlParser::getUrl())->firstOrFail();
    $this->siteSettings = (new SiteSettingsFactory($this->site))->createSiteSettings();
  }

  public function index()
  {
    return view('pages.index')->with(['settings' => $this->siteSettings, 'site' => $this->site]);
  }
}

Миграция для модели Site.php
class CreateSitesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('sites', function (Blueprint $table) {
            $table->increments('id');
            $table->string('http_host');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('sites');
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы