2 votes

Comment éviter index.php dans la route de Zend Framework en utilisant la réécriture de Nginx

J'essaie de me débarrasser de index.php dans la route par défaut de Zend Framework. Je pense que cela devrait être corrigé au niveau du serveur et non de l'application. (Corrigez-moi si je me trompe, mais je pense que le faire du côté du serveur est plus efficace).

J'utilise Nginx 0.7.1 et php-fpm 5.3.3.

Voici ma configuration nginx

server {
    listen *:80;
        server_name domain;
        root   /path/to/http;
        index index.php;
        client_max_body_size 30m;

        location / {
                try_files $uri $uri/ /index.php?$args;
        }
        location /min {
                try_files $uri $uri/ /min/index.php?q=;
        }
        location /blog {
                try_files $uri $uri/ /blog/index.php;
        }
        location /apc {
                try_files $uri $uri/ /apc.php$args;
        }

        location ~ \.php {
                include /usr/local/etc/nginx/conf.d/params/fastcgi_params_local;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PATH_INFO $fastcgi_script_name;
                fastcgi_param SERVER_NAME $http_host;
                fastcgi_pass 127.0.0.1:9000;
        }

        location ~* ^.+\.(ht|svn)$ {
                deny  all;
        }

        # Static files location
        location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$ {
            expires max;
        }

}

En fait, www.domain.com/index.php/path/to/url et www.domain.com/path/to/url servent le même contenu.

J'aimerais corriger cela en utilisant la réécriture de nginx.

1voto

jollyroger Points 1630

Vous aurez besoin d'emplacements similaires à ceux-ci dans chacun de vos sites . Je suis juste en train d'écrire un exemple pour /blog emplacement :

location /blog/ {
    try_files $uri $uri/ @blog;
}

location @blog {
    rewrite ^/blog/(.*)$ /blog/index.php/$1 last;
}

Également repéré dans votre configuration : vous pourriez vouloir utiliser fastcgi_split_path_info dans votre emplacement PHP :

location ~ ^(.+\.php)(.*)$ {
    include fastcgi_params;
    fastcgi_split_path_info ^(.+\.php)(.*)$;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_pass   localhost:9000;
}   

Voir documentation pour les détails.

0 votes

Merci pour la réponse, mais cela n'a pas résolu mon problème.

1voto

mgorven Points 29736

La solution idéale implique un soutien de la part de l'application, en ce sens qu'elle doit comprendre le chemin qu'elle emprunte. Cela lui permet de sélectionner la bonne ressource à servir, et de renvoyer les liens et les redirections corrects. Dans ce cas, la configuration de nginx ressemblerait à ceci :

location / {
    include fastcgi_params;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_script_name;
    fastcgi_pass 127.0.0.1:9000;
}

c'est-à-dire simplement passer tout [0] à un script PHP spécifique. Cela peut effectivement fonctionner avec Zend (je ne l'ai pas utilisé moi-même).

S'il n'est pas possible de modifier l'application pour qu'elle comprenne cela, les choses se compliquent avec la réécriture des chemins et la modification du contenu. Le problème avec la réécriture est de s'assurer que le chemin réécrit ne sera pas réécrit à nouveau. Ce qui suit va réécrire les chemins vers /index.php et les transmettre à Zend.

location ~ \.php(/|$) {
    include fastcgi_params;
    fastcgi_split_path_info ^(.+\.php)(.*)$;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_pass 127.0.0.1:9000;
}

location / {
    rewrite ^/(.*)$ /index.php/$1;
}

Si cela ne fonctionne pas, c'est probablement parce que Zend ne traite pas la requête correctement - vérifiez les logs pour voir quel chemin il essaie de localiser.

Cela ne va pas faire en sorte que les liens retournés en HTML ou les redirections envoyées par Zend utilisent le chemin sans "index.php" cependant, et nginx ne semble pas avoir de mécanisme pour les modifier. Vérifiez si Zend a un moyen de configurer le chemin de la racine pour les liens et les redirections.

[0] Vous voudriez évidemment servir le contenu statique directement, j'ai omis de le faire.

0voto

iProgram Points 4380

Essayez quelque chose comme ça :

rewrite ^/(.*)$    /index.php/$1;

0 votes

Je suis presque sûr à 100% d'avoir déjà essayé ça et ça n'a pas aidé.

0voto

Mohannad Points 319
# Rewrite rule adapted for Zend Framework
location / {
    index index.php;
    if (!-f $request_filename) {
        rewrite ^(.*)$ /index.php last;
    }
}

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X