首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

Symfony2 基於域名的路由配置完整指南:YAML/XML/PHP 三種格式

     編輯:PHP 綜合知識

核心概念

Symfony 路由支持 host 選項,根據 HTTP Host 頭匹配不同路由,實現多域名/子域名應用架構。

基礎域名路由配置

YAML 格式 (routing.yml)

mobile_homepage:
    path: /
    host: m.example.com
    defaults: { _controller: AcmeDemoBundle:Main:mobileHomepage }

homepage:
    path: /
    defaults: { _controller: AcmeDemoBundle:Main:homepage }

XML 格式 (routing.xml)


    
        AcmeDemoBundle:Main:mobileHomepage
    
    
        AcmeDemoBundle:Main:homepage
    

PHP 格式 (routing.php)

use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;

$collection = new RouteCollection();
$collection->add('mobile_homepage', new Route('/', [
    '_controller' => 'AcmeDemoBundle:Main:mobileHomepage',
], [], [], 'm.example.com'));

$collection->add('homepage', new Route('/', [
    '_controller' => 'AcmeDemoBundle:Main:homepage',
]));

return $collection;

效果:同路徑 /,Host 為 m.example.com 命中移動端控制器,其他域名命中默認控制器。

進階:域名佔位符與動態匹配

子域名作為參數

projects_homepage:
    path: /
    host: "{project_name}.example.com"
    defaults: { _controller: AcmeDemoBundle:Main:projectHomepage }

訪問 foo.example.com/ → $project_name = 'foo' 传給控制器。

正則約束與默認值

mobile_homepage:
    path: /
    host: "{subdomain}.example.com"
    defaults:
        _controller: AcmeDemoBundle:Main:mobileHomepage
        subdomain: m
    requirements:
        subdomain: m|mobile

僅匹配 m.example.com 和 mobile.example.com,默認 m。

使用服務容器參數

mobile_homepage:
    path: /
    host: "m.{domain}"
    defaults:
        _controller: AcmeDemoBundle:Main:mobileHomepage
        domain: '%domain%'
    requirements:
        domain: '%domain%'

%domain% 從 parameters.yml 讀取,避免硬編碼域名。

路由導入時設置統一 Host

acme_hello:
    resource: '@AcmeHelloBundle/Resources/config/routing.yml'
    host: "hello.example.com"

導入的所有路由自動獲得 hello.example.com 前綴。

控制器測試:模擬 Host 頭

$crawler = $client->request(
    'GET',
    '/homepage',
    [],
    [],
    ['HTTP_HOST' => 'm.' . $client->getContainer()->getParameter('domain')]
);

Functional 測試必須設置 HTTP_HOST 服務器參數,否則路由不匹配。

最佳實踐總結

  1. 統一配置格式:項目中選擇一種格式(推薦 YAML)保持一致
  2. 參數化域名:使用 %domain% 參數,區分 dev/stage/prod 環境
  3. 約束嚴格:requirements 限制佔位符範圍,防止路由劫持
  4. 默認值設置:佔位符必須有 defaults,否則生成 URL 時需強制傳值
  5. 測試覆蓋:Functional 測試驗證各域名路由正確匹配

常見問題

問題原因解決
生成 URL 缺少 Host佔位符無默認值添加 defaults 或調用時傳參
子域名路由不匹配Nginx/Apache 未轉發 Host 頭配置 proxy_set_header Host $host;
測試 404未設置 HTTP_HOST請求參數添加 HTTP_HOST

總結

Symfony2 域名路由功能強大,支持靜態域名、動態佔位符、正則約束、參數化配置、批量導入。合理使用可構建清晰的多域名應用架構(主站、移動端、API、租戶隔離等)。核心在於:Host 匹配優先於 Path,佔位符需約束與默認值雙重保障。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved