Zend Framework auf nginx
-
22-08-2019 - |
Frage
Die Zend Framework-basierte Website Ich habe jetzt gearbeitet wird, um seinen Produktionsserver migriert. Dieser Server stellt sich heraus, nginx zu sein (Überraschung!). Natürlich ist die Website funktioniert nicht richtig, wie es auf Apache und stützt sich auf eine .htaccess-Datei entwickelt wurde.
Meine Frage ist ... jemand Erfahrung mit diesem haben? Alle Ideen, wie zu übersetzen, was die .htaccess-Datei wird auf eine nginx.conf-Datei? Ich bin der Erforschung dieses aber ich hoffe, dass jemand schon Erfahrung mit diesem hat. Dank!
EDIT: Dies ist die aktuelle .htaccess:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ /index.php [NC,L]
Lösung
Ich weiß, es ist ein ziemlich alten Thread, aber es könnte einige Leute helfen sowieso.
Grundsätzlich leitet es automatisch alle 404-Fehler auf index.php, aber wenn die Datei (Typ-Datei) vorhanden ist, wird es die richtige Wurzel gesetzt.
Ich habe es aus der Spitze von meinem Kopf. Es ist vielleicht nicht sofort funktionieren, und Sie haben den richtigen Weg und fastcgi Config zu setzen. Ich habe auch alles index.php zurück, wie es so mit Zend_Framework arbeiten sollte
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;
}
Andere Tipps
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;
}
}
Es wird empfohlen, try_files zu verwenden, wenn immer es möglich ist.
Ich weiß nicht jeder automatisch / systematisch die .htaccess-Datei zu konvertieren, werden Sie wahrscheinlich es manuell zu tun haben. Die Nginx Wiki ist die beste Ressource für nginx Dokumentation.
Edit: Ich bin mit Zend Framework auf Nginx mich jetzt und die Config sieht wie folgt aus:
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;
}
}
Wie Sie sehen können, die Rewrite-Regel selbst ist sehr einfach.
Das ist "offizielle", einfach und funktioniert schön:
Für Server Staging, die helfen könnten;)
fastcgi_param APPLICATION_ENV staging;
Eigentlich laufe ich einen nginx mit einer Drupal-Website, die wie Zend Framework arbeiten: eine index.php als Bootstrap
Das ist die Regel (nicht auf Zend Framework getestet, nur auf Drupal, sollte aber ähnlich sein)
location / {
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php?q=$1 last;
break;
}
}
error_page 404 /index.php;
Wenn Sie ein Unterverzeichnis für Ihr Projekt verwenden, wie http: //some.url/myproject/controller/ , dann müssen Sie auch setBaseUrl in der Bootstrap-Datei.
hinzufügen<?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!
}
}
Die nginx Rewrite würde wie folgt aussehen:
location /myproject/ {
if (!-e $request_filename) {
rewrite ^/myproject/(.*)$ /index.php?$1? last;
}
}
PS Das Fragezeichen ist nicht Typo!
Wenn es überhaupt möglich wäre, würde ich empfehlen, dass sie Setup Apache auf einem Nicht-Standard-Port nur von der Nginx-Box und Nginx Proxy Apache hat.