Comment activer des URL propres avec Nginx?

9

J'utilise Drupal 7.x. J'ai réussi à le faire fonctionner sans URL propres.

En enquêtant, j'ai compris que je devais créer un vhost pour chaque site drupal et activer des URL propres avec le code suivant.

if (-e $ REQUEST_FILENAME) {
     rewrite ^ / (. *) $ / index.php? q = $ 1 last;
}

Alternativement, je pourrais utiliser ce code.

location / {
         [... ]
         error_page 404 = @ drupal;
         [... ]
}

location @ drupal {
         rewrite ^ (. *) $ / index.php? q = $ 1 last;
}

Cependant, j'ai également vu que sans créer un vhost peut activer des URL propres (comme Apache). J'ai essayé sur les deux lignes dans ma configuration mais je n'obtiens pas de résultat. Lorsque j'active des URL propres, il affiche toujours le mot Nginx (l'hôte local).

Quelle est la bonne façon d'activer des URL propres?

Ceci est ma configuration dans / etc / nginx / sites-available / default.

server {
        listen   80; ## listen for ipv4; this line is default and implied
        listen   [::]:80 default ipv6only=on; ## listen for ipv6

        root /usr/share/nginx/www;
        index index.php index.html index.htm;

        # Make site accessible from http://localhost/
        server_name localhost;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to index.html
                try_files $uri $uri/ /index.html;
                # Uncomment to enable naxsi on this location
                # include /etc/nginx/naxsi.rules
        }

        location /doc/ {
                alias /usr/share/doc/;
                autoindex on;
                allow 127.0.0.1;
                deny all;
        }

        location /images {
                root /usr/share;
                autoindex off;
        }
        # Only for nginx-naxsi : process denied requests
        #location /RequestDenied {
                # For example, return an error code
                #return 418;
        #}

        #error_page 404 /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
                root /usr/share/nginx/www;
        }

        #Pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
                try_files $uri =404;
                #fastcgi_split_path_info ^(.+\.php)(/.+)$;
        # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

                # With php5-cgi alone:
                #fastcgi_pass 127.0.0.1:9000;
                # With php5-fpm:
                fastcgi_pass unix:/tmp/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        location ~ /\.ht {
                deny all;
        }
}

Je n'ai créé aucun vhost sur mon serveur; je ne sais pas non plus comment.

Eduardo
la source
1
Avez-vous vu / essayé ce qui suit, à partir de documents Drupal? drupal.org/node/976392
geerlingguy
@geerlingguy Oui. Cette partie du code que j'ai ajoutée à mon fichier par défaut dans site-available et, lorsque j'entre sur mon site, j'obtiens l'erreur 500. Ou dois-je créer un vhost?
Eduardo
1
Jetez un œil sur github.com/perusio/drupal-with-nginx . Il a toutes les options de configuration dont vous aurez probablement besoin pour faire fonctionner Drupal sur un serveur Nginx.
jamestsymp

Réponses:

11

J'ai ensuite ce travail avec succès:

  location / {
    index index.php;
    # This is cool because no php is touched for static content
    try_files $uri $uri/ @rewrite;
    expires max;
  }

  location @rewrite {
    # Some modules enforce no slash (/) at the end of the URL
    # Else this rewrite block wouldn't be needed (GlobalRedirect)
    rewrite ^/(.*)$ /index.php?q=$1;
  }

  location ~ \.php$ {
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME /srv/www/www.example.com/public_html$fastcgi_script_name;
    fastcgi_intercept_errors on;
    fastcgi_pass unix:/var/run/php-fpm.sock; # fastcgi_pass unix:/tmp/php5-fpm.sock;
 }
Nikit
la source
j'ai ajouté @rewriteet location @rewrite{}dans mon fichier /etc/nginx/sites-available/defaultet restartn nginx mais ne fonctionne pas pour mon. Lorsque j'active l'URL de nettoyage, affichez l'hôte local.
Eduardo
2Eduardo: vous voulez donc dire que site.com/index.php fonctionne et ouvre la première page pour vous?
Nikit
Oui. Je peux voir la première page .. Mais pas les autres pages
Eduardo
hmm, pouvez-vous coller votre code à nouveau?
Nikit
fonctionne bien pour moi
grossier