Ich habe ein Projekt mit Symfony 3.1 und ich habe eine ziemlich harte Zeit während der Bereitstellungsphase.Symfony3 Routing in Produktion
Mein Routing funktioniert perfekt in der Entwicklungsumgebung, mit dem eingebauten Server, aber in der Produktionsumgebung funktionieren einige Routen nicht. Sie feuern einen 405-Fehler, der besagt, dass die Methode nicht erlaubt ist.
Zum Beispiel eine der Routen, die nicht den Fall funktionieren (es feuert 405 wird POST nicht erlaubt, erlaubt: "GET, HEAD"):
http POST http://domain/api/benefits
Andere arbeiten perfekt, wie
http GET http://domain/api/benefits
ich habe versucht, den Cache über zurücksetzen:
./bin/console cache:clear -e=prod --no-debug
Außerdem, wenn ich zu nennen:
./bin/console debug:router --env=prod
Meine Routen sind da. Sie können die ouput hier sehen:
----------------------------- -------- -------- ------ -------------------------------
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}
Mein routing.yml ist:
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]
Jede Ausrichtung wäre hig Hly geschätzt, da ich das Problem nicht finden kann.
Vielen Dank.
EDIT:
Nur für den Fall, ich meine Apache Vhost Posting:
<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>
Sieht aus wie die betreffende Strecke für PUT nicht definiert ist POST? – Cerad
Es ist nicht, in der Fehlersuche heißt es: api_new_benefits POST ANY ANY/api/Vorteile/ Oder fehlt mir etwas? Es funktioniert sowieso perfekt im Entwickler. –
Sie haben Recht. Wie genau generieren Sie die Anfrage? Ajax oder ein HTML-Formular. HTML-Formulare sind wirklich nur für den POST gedacht. http://symfony.com/doc/current/cookbook/routing/method_parameters.html – Cerad