Удаление индексных файлов из URL с помощью Nginx - PullRequest
1 голос
/ 18 сентября 2011

На работе мы переключаемся с общего стека LAMP на VPS под управлением nginx.Мне гораздо удобнее с Apache, но научиться использовать Nginx было довольно увлекательно (или столь же увлекательно, как и обучение настройке нового веб-сервера.

Текущая проблема заключается в следующем: onнесколько доменов, которые нам нужно удалить index.php из URL для канонизации. Это последнее, что нам нужно сейчас позаботиться об этих доменах.

Я исследовал множество различных методов удаления индекса.php из URL (большинство из которых специально для CI или ExpressionEngine), и я попытался адаптировать некоторые из них для личного использования, но в итоге я получаю ошибку бесконечного цикла, которая, как я могу себе представить, связана со следующим:

location / {
    try_files $uri $uri/ /index.php?$args =404;
}  

Я одержим желанием узнать, как все это работает, но сейчас мне нужно обратиться за помощью, чтобы выяснить это, чтобы мы могли двигаться вперед, и я мог понять, что яЯ поступаю неправильно.

Буду очень признателен за любые ответы и буду благодарен всем, кто пожелаетнемного углубиться в тему, чтобы помочь кому-то новому, как я и кто-то еще, кто может быть в подобной ситуации, которая читает это.

Спасибо!

ОБНОВЛЕНИЕ
Чтобы упростить ситуацию, я просто выложу здесь свою конфигурацию nginx для этого vhost.

server  {
    listen          80;
    server_name     examplesite.com;
    # redirect non-www to www. for canonical urls
    rewrite ^/(.*) http://www.examplesite.com/$1 permanent; 
}

server {
    listen          80;
    server_name     www.examplesite.com;

    error_log   /srv/http/nginx/examplesite.com/log/nginx-error.log;
    access_log  /srv/http/nginx/examplesite.com/log/nginx-access.log;

    root  /srv/http/nginx/examplesite.com/root;

    location / {
        try_files $uri $uri/ /index.php?$args =404;
    }

    location ~ \.php$ {
        include        fastcgi.conf;
        fastcgi_param  PHP_ADMIN_VALUE "error_log=/srv/http/nginx/examplesite.com/log/php-error.log";
        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
    }

}

Ответы [ 2 ]

0 голосов
/ 21 сентября 2011

Попробуйте это ...

server  {
    listen          80;
    server_name     examplesite.com;
    # redirect non-www to www. for canonical urls
    # proper way to do this
    rewrite ^ http://www.examplesite.com$request_uri? permanent; 
}

server {
    listen          80;
    server_name     www.examplesite.com;

    error_log   /srv/http/nginx/examplesite.com/log/nginx-error.log;
    access_log  /srv/http/nginx/examplesite.com/log/nginx-access.log;

    root  /srv/http/nginx/examplesite.com/root;

    # add index under server as you have done for root
    index index.php index.html;

    location / {
        # drop the "=404". Nginx will return 404 by itself if not found.
        # note the "last" should not be added to "try_files"
        # whether you need something after "$uri/" depends on your setup.
        # this should do for most unless running WP etc
        try_files $uri $uri/;
    }

    location ~ \.php$ {
        # Return '400 Bad Request' for malformed URLs
        # See: http://wiki.nginx.org/Pitfalls#Pass_Non-PHP_Requests_to_PHP.
        location ~ \..*/.*\.php$ {
            return 400;
        }

        # Rewrite "index.php" requests
        rewrite ^(.*)index.php(.*)$ $1$2    permanent;

        # continue for other php and rewritten "index.php" requests 
        include        fastcgi.conf;
        fastcgi_param  PHP_ADMIN_VALUE "error_log=/srv/http/nginx/examplesite.com/log/php-error.log";
        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
    }

    ...


}

Не 100% в строке перезаписи index.php, так как есть вероятность, что она может поставить вас в цикл перенаправления.Если это так, то ответ заключается в том, чтобы просто обслуживать запросы index.php, но изменить все ссылки в приложении, чтобы удалить их, чтобы они со временем исчезали.

0 голосов
/ 18 сентября 2011

Сначала проверьте вашу директиву index

server {
  index index.php index.html;
  ...

Затем убедитесь, что php правильно обрабатывается вашим сконфигурированным бэкэндом

location ~ \.php$ {
    include         fastcgi_params;
    fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass    backend;
}

Где backend - это ранее настроенный апстрим, например,:

upstream backend {
    server 127.0.0.1:9000;
}

Посмотрите на пример VirtualHost

...