2013-12-19 65 views
3

無論我嘗試實現https通道,都會出現無限重定向循環。這就是security.yml文件看起來像:使用https在Symfony2中重定向任何URL上的循環

security: 
    encoders: 
     FOS\UserBundle\Model\UserInterface: sha512 

    role_hierarchy: 
     ROLE_ADMIN:  ROLE_USER 
     ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH] 

    providers: 
     fos_userbundle: 
      id: fos_user.user_provider.username 

    firewalls: 
     main: 
      pattern: .* 
      form_login: 
       provider: fos_userbundle 
       csrf_provider: form.csrf_provider 
       check_path: /login_check 
       login_path: /login 
       default_target_path: /home 
      logout: 
       path: /logout 
       target: /index 
      security: true 
      anonymous: true 
      remember_me: 
       key:  mySecret 
       lifetime: 604800 #seven days 
       path: /
       domain: ~ 

    access_control: 
     - { path: ^/js, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/css, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/_wdt, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/_profiler, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/index*, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/admin/.*, role: ROLE_ADMIN } 
     - { path: ^/.*, roles: ROLE_USER } 

例如,如果我改變了管理路徑:

- { path: ^/admin/.*, role: ROLE_ADMIN, requires_channel: https } 

將出現環。 另外在路由/ entity.yml我想是這樣的:

entity_index: 
    pattern:/
    defaults: { _controller: MyBundle:Entity:index } 
    schemes: [https] 

任何人有一個想法如何解決這個問題?

+0

在這裏得到了同樣的問題...我使用FOSUserBundle&FOSFacebookBundle ...真的需要它是https,因爲它是一個Facebook選項卡...希望有人知道如何解決這個問題...我會不斷更新我的進度... – AlexK

+0

你知道它重定向到的URL是什麼嗎?使用控制檯並記錄不同的重定向。你使用NGINX還是Apache?您的Web服務器上是否啓用了HTTPS? –

+0

在AlexK:Thanx,請做! @Thomas。在Chrome中,我可以看到它給了我一個「301永久移動」。它將我重定向到我嘗試打開的同一頁面。使用apache。詢問服務器管理員是否啓用了HTTPS。我會盡快將它發佈在這裏。 – apfz

回答

0

儘管看起來原始海報的問題是在其開發服務器上未啓用HTTPS的情況,但最近我遇到了類似的問題,並認爲我會分享我如何解決它。

就我而言,我的security.yml看起來是這樣的:

security: 
    encoders: 
     FOS\UserBundle\Model\UserInterface: bcrypt 

    role_hierarchy: 
     ROLE_ADMIN:  ROLE_USER 
     ROLE_SUPER_ADMIN: ROLE_ADMIN 

    providers: 
     fos_userbundle: 
      id: fos_user.user_provider.username 

    firewalls: 
     main: 
      pattern: ^/ 
      form_login: 
       provider: fos_userbundle 
       csrf_provider: form.csrf_provider 
       default_target_path: /dm 
      logout: true 
      anonymous: true 

    access_control: 
     - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https } 
     - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https } 
     - { path: ^/dm, role: IS_AUTHENTICATED_REMEMBERED, requires_channel: https } 
     - { path: ^/dm/*, role: IS_AUTHENTICATED_REMEMBERED, requires_channel: https } 
     - { path: ^/*, role: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https } 

而在我的情況下,HTTPS每一頁上的工作,但任何需要的任何類型的登錄。此外,我從谷歌CDN拉我的JavaScript和CSS文件無法加載。在年底,有兩個問題與我的代碼:

問題1:

識別通道多次。就我而言,我在我的routing.yml文件中有一個指令,指定使用http,以及上面的security.yml文件中指定的一個指定https的指令。這意味着我的應用程序(需要我登錄的那些應用程序)管理的路徑將被安全系統路由到https,然後將安全系統發送回嘗試將其更改爲http的路由系統,然後將其發回給安全系統將其改回https,無限重定向循環。通過刪除routing.yml中的指令,此問題已修復。

問題2:

我失蹤從我的CDN構成一個行assetic:

ssl: ['https://ajax.googleapis.com/ajax/libs/'] 

擺在config.yml像這樣:

framework: 
    #esi:    ~ 
    translator:  { fallbacks: ["en"] } 
    secret:   "%secret%" 
    router: 
     resource: "%kernel.root_dir%/config/routing.yml" 
     strict_requirements: ~ 
    form:   ~ 
    csrf_protection: ~ 
    validation:  { enable_annotations: true } 
    templating: 
     engines: ['twig'] 
     #assets_version: SomeVersionScheme 
     packages: 
      cdn: 
       base_urls: 
        http: ['https://ajax.googleapis.com/ajax/libs/'] 
        ssl: ['https://ajax.googleapis.com/ajax/libs/'] 

缺少此行意味着資產在使用ssl時忽略了我的軟件包定義,並嘗試從我自己的服務器上加載它們不存在的文件。

1

我有同樣的問題,因爲服務器坐在一個反向代理後面,通過ssl與客戶端通信,但http與運行應用程序的服務器通信。我只使用了它,因爲RP和App Server之間的連接是安全的,因爲它不會離開內部網絡。如果你真的正面你真的有SSL運行,出現這個問題,有一個醜陋的修復爲...但它真的不得已使用你自己的風險:

可以覆蓋服務器在您瓦爾應用程序。PHP的是這樣的:

$_SERVER['HTTPS'] = 'on'; 
$_SERVER['SERVER_PORT'] = 443; 
再次

,這是一個醜陋的修復,而不是一個解決方案,只有在你唯一的風險和負有責任使用,我也不會做,如果我沒有與我的反向代理問題不轉發端口,並不是100%確定我在客戶端和RP之間有SSL。別忘了,如果你真的沒有運行有效的SSL,這會讓你容易受到攻擊。

+1

感謝您的支持。我認爲這是一個可接受的解決方案app_dev.php並解決了我的問題。 – redreinard

1

對我來說,問題不在於Symfony,而在於Nginx配置錯誤。如果您使用的是Nginx,請確保您沒有此設置: fastcgi_param HTTPS off;否則將其設置爲on並重新啓動服務器。希望它有幫助