2016-06-15 2 views
0

У меня есть проект с использованием Symfony 3.1, и у меня довольно сложное время на этапе развертывания.Symfony3 routing in production

Моя маршрутизация отлично работает в среде dev, используя встроенный сервер, но в производственной среде некоторые маршруты не работают. Они запускают ошибку 405, говоря, что метод не разрешен.

К примеру, один из маршрутов, которые не работают в (он стреляет 405, POST не допускается, допускается: "GET, HEAD"):

http POST http://domain/api/benefits 

Другие работают отлично, такие как

http GET http://domain/api/benefits 

Я попытался сбросить кэш через:

./bin/console cache:clear -e=prod --no-debug 

Кроме того, если я призываю:

./bin/console debug:router --env=prod 

Мои маршруты есть. Вы можете увидеть здесь: выводе

----------------------------- -------- -------- ------ ------------------------------- 
    Name       Method Scheme Host Path       
----------------------------- -------- -------- ------ ------------------------------- 
    api_read_benefit    GET  ANY  ANY /api/benefits/{id}    
    api_delete_benefit   DELETE ANY  ANY /api/benefits/{id}    
    api_edit_benefit    PUT  ANY  ANY /api/benefits/{id}    
    api_edit_benefit_picture  POST  ANY  ANY /api/benefits/picture/{id}  
    api_edit_benefit_attachment POST  ANY  ANY /api/benefits/attachment/{id} 
    api_list_benefits    GET  ANY  ANY /api/benefits/     
    api_new_benefits    POST  ANY  ANY /api/benefits/     
    api_read_entity    GET  ANY  ANY /api/entities/{id}    
    api_delete_entity    DELETE ANY  ANY /api/entities/{id}    
    api_list_entities    GET  ANY  ANY /api/entities/     
    api_new_entities    POST  ANY  ANY /api/entities/     
    logout      ANY  ANY  ANY /logout       
    lang       ANY  ANY  ANY /lang       
    app       ANY  ANY  ANY /{url} 

Мой routing.yml является:

api: 
    resource: "@AppBundle/routing.yml" 
    prefix: /api 

logout: 
    path: /logout 

lang: 
    path: /lang 
    defaults: {_controller: AppBundle:Default:lang} 

app: 
    path:  /{url} 
    requirements: 
      url: ".*" 
    defaults: {_controller: AppBundle:Default:index} 

AppBundle/routing.yml:

api_benefits: 
    resource: "@AppBundle/Controller/benefits_routing.yml" 
    prefix: /benefits 

api_entities: 
    resource: "@AppBundle/Controller/entities_routing.yml" 
    prefix: /entities 

api_users: 
    resource: "@AppBundle/Controller/entities_routing.yml" 
    prefix: /entities 

AppBundle/Controller/benefits_routing.yml:

api_read_benefit: 
    path: /{id} 
    defaults: {_controller: "AppBundle:Benefits:read" } 
    methods: [GET] 
api_delete_benefit: 
    path: /{id} 
    defaults: {_controller: "AppBundle:Benefits:delete" } 
    methods: [DELETE] 
api_edit_benefit: 
    path: /{id} 
    defaults: {_controller: "AppBundle:Benefits:edit" } 
    methods: [PUT] 
api_edit_benefit_picture: 
    path: /picture/{id} 
    defaults: {_controller: "AppBundle:Benefits:pictureChange" } 
    methods: [POST] 
api_edit_benefit_attachment: 
    path: /attachment/{id} 
    defaults: {_controller: "AppBundle:Benefits:attachmentChange" } 
    methods: [POST] 
api_list_benefits: 
    path:/
    defaults: {_controller: "AppBundle:Benefits:list" } 
    methods: [GET] 
api_new_benefits: 
    path:/
    defaults: {_controller: "AppBundle:Benefits:new" } 
    methods: [POST] 

Любая ориентация была бы высокой hly оценили, так как я не могу найти проблему.

спасибо.

EDIT:

На всякий случай, я отправляю ВХост мой Апача:

<VirtualHost 51.254.96.87:443> 
    ServerName domain 

    SSLEngine On 
    SSLProxyEngine On 
    SSLCertificateFile /etc/letsencrypt/live/domain/fullchain.pem 
    SSLCertificateKeyFile /etc/letsencrypt/live/domain/privkey.pem 

    DocumentRoot dir/web 
    <Directory dir/web> 
      AllowOverride All 
      Order allow,deny 
      Allow from all 
      <IfModule mod_rewrite.c> 
       Options -MultiViews 
       RewriteEngine On 
       RewriteCond %{REQUEST_FILENAME} !-f 
       RewriteRule ^(.*)$ app.php [QSA,L] 
      </IfModule> 
    </Directory> 
    <Directory dir/web/bundles> 
      <IfModule mod_rewrite.c> 
        RewriteEngine Off 
      </IfModule> 
    </Directory> 
    LogLevel warn 
    ErrorLog ${APACHE_LOG_DIR}/error.log 
    CustomLog ${APACHE_LOG_DIR}/access.log combined 
</VirtualHost> 

<VirtualHost 51.254.96.87:80> 
    ServerName domain 
    Redirect permanent/https://domain 
</VirtualHost> 
+0

Похоже маршрут в вопросе определен для PUT не POST? – Cerad

+0

Это не так, в отладке говорится: api_new_benefits POST ANY ANY/api/benefits/ Или я что-то упускаю? Во всяком случае, он отлично работает в dev. –

+0

Вы правы. Как именно вы генерируете запрос? Ajax или html-форму. Html-формы действительно разработаны только для POST. http://symfony.com/doc/current/cookbook/routing/method_parameters.html – Cerad

ответ