Zend Framework sur nginx
-
22-08-2019 - |
Question
Le site basé Zend Framework, je travaille actuellement est en cours de migration vers son serveur de production. Ce serveur se révèle être nginx (surprise!). Naturellement, le site fait comme il a été développé fonctionne pas correctement sur Apache et repose sur un fichier htaccess.
Ma question est ... Quelqu'un at-il une expérience avec cela? Toutes les idées sur la façon de traduire ce que le fichier htaccess fait dans un fichier nginx.conf? Je fais des recherches, mais ce espère que quelqu'un a déjà une expérience avec cela. Merci!
EDIT: Voici le htaccess courant:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ /index.php [NC,L]
La solution
Je sais qu'il est un fil assez vieux, mais il pourrait aider certaines personnes de toute façon.
Fondamentalement, il redirige toute erreur 404 à index.php, mais si le fichier existe (fichier de type), il établira la racine à droite.
Je l'ai fait à partir du haut de ma tête. Il pourrait ne pas travailler tout de suite, et vous devez mettre le droit chemin et configuration FastCGI. J'ai aussi tout remettrai à index.php comme il devrait fonctionner comme ça avec Zend_Framework
error_page 404 = /index.php;
location / {
if (-f $request_filename) {
root /var/www;
}
}
location ~ \.php$ {
fastcgi_pass unix:/tmp/php.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/index.php;
include /etc/nginx/fastcgi_params;
}
Autres conseils
server {
listen 80; ## listen for ipv4
listen [::]:80 default ipv6only=on; ## listen for ipv6
server_name localhost;
access_log /var/log/nginx/localhost.access.log;
error_log /var/log/nginx/localhost.error.log;
root /var/www/localhost/public;
try_files $uri @php_index;
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location @php_index {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME /var/www/localhost/index.php;
include fastcgi_params;
}
}
Il est recommandé d'utiliser try_files chaque fois que possible.
Je ne connais pas de manière automatique / systématique pour convertir le htaccess fichier, vous devrez probablement le faire manuellement. wiki Nginx est la meilleure adresse pour la documentation nginx.
Edit: Je suis en cours d'exécution Zend Framework sur Nginx moi-même maintenant et la configuration ressemble à ceci:
server {
listen 80;
server_name servername.com;
root /var/www/zendapp/public;
location / {
index index.php;
}
# Deny access to sensitive files.
location ~ (\.inc\.php|\.tpl|\.sql|\.tpl\.php|\.db)$ {
deny all;
}
location ~ \.htaccess {
deny all;
}
# Rewrite rule adapted from zendapp/public/.htaccess
if (!-e $request_filename) {
rewrite ^.*$ /index.php last;
}
# PHP scripts will be forwarded to fastcgi processess.
# Remember that the `fastcgi_pass` directive must specify the same
# port on which `spawn-fcgi` runs.
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
}
location = /50x.html {
root /var/www/default;
}
}
Comme vous pouvez le voir, la règle de réécriture lui-même est très simple.
est "officiel", simple et fonctionne bien:
Pour le serveur mise en scène qui pourrait aider;)
fastcgi_param APPLICATION_ENV staging;
En fait, je lance un nginx avec un site qui fonctionnent comme Drupal zend framework: un index.php Bootstrap-
est la règle (non testé sur zend framework, juste drupal, mais devrait être similaire)
location / {
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php?q=$1 last;
break;
}
}
error_page 404 /index.php;
Si vous utilisez un sous-répertoire pour votre projet comme http: //some.url/myproject/controller/ , vous devez également ajouter setBaseUrl à votre fichier d'amorçage.
<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
protected function _initSomeFancyName()
{
$this->bootstrap('frontController');
$frontController = Zend_Controller_Front::getInstance();
$frontController->setBaseUrl('/myproject'); // set the base url!
}
}
La réécriture nginx ressemblerait à ceci:
location /myproject/ {
if (!-e $request_filename) {
rewrite ^/myproject/(.*)$ /index.php?$1? last;
}
}
PS La marque de question typo pas!
S'il était possible, je recommande qu'ils configurer Apache sur un port non standard accessible uniquement dans la zone Nginx et ont proxy Nginx à Apache.