9

I'm using Drupal 7.x. I have achieved to make it work without clean URLs.

Investigating, I have understood that I should create a vhost for each drupal site and enable clean URLs with the following code.

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

Alternatively, I could use this code.

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

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

However, I've also seen that without creating a vhost can enable clean URLs (like Apache). I tried on both lines in my setup but I do not get a result. When I enable clean URLs it always displays the word Nginx (The localhost).

What is the right way to enable clean URLs?

This is my configuration in /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;
        }
}

I have not created any vhost on my server; neither do I know how.

3
  • 1
    Have you seen/tried the following, from Drupal docs? drupal.org/node/976392 Feb 9, 2013 at 22:10
  • @geerlingguy Yes. This part of code I added to my default file in site-available and, when I enter to my site I get error 500. Or i need to create a vhost?
    – Eduardo
    Feb 10, 2013 at 0:18
  • 1
    Have a look at github.com/perusio/drupal-with-nginx. It has all the configuration options you're likely to need to getting Drupal running on a Nginx server.
    – jamestsymp
    Dec 2, 2013 at 11:14

1 Answer 1

11

I have next that work successfully:

  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;
 }
5
  • i added @rewrite and location @rewrite{} in my file /etc/nginx/sites-available/default and restartn nginx but doesn't work for my. When i enable cleans url, display the localhost.
    – Eduardo
    Feb 10, 2013 at 17:50
  • 2Eduardo: so you mean that site.com/index.php is working and open front page for you?
    – Nikit
    Feb 10, 2013 at 21:45
  • Yes. I can view the Front Page.. But no the others pages
    – Eduardo
    Feb 11, 2013 at 3:42
  • hmm, can you pastebin your code again?
    – Nikit
    Feb 11, 2013 at 3:53
  • works fine for me
    – rude
    Jan 24, 2016 at 16:36

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.