Назад | Перейти на главную страницу

Конфигурация сервера Nginx - проблема с перезаписью

У меня следующая конфигурация сервера:

server {
    listen       80;
    server_name  mysite.proj;

    location / {
        root /path/to/mysite.proj/www;
        index index.php index.html index.htm;
    }

    access_log /path/to/mysite.proj/data/logs/access.log;
    error_log  /path/to/mysite.proj/data/logs/error.log;

    if (!-e $request_filename) {
        rewrite ^(.+)$ /index.php last;
    }

    location ~ \.php$ {
        root           /path/to/mysite.proj/www;
        fastcgi_pass   127.0.0.1:8081;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /path/to/mysite.proj/www$fastcgi_script_name;
        include        fastcgi_params;
    }
}

server {
    listen 80;
    server_name www.mysite.proj;
    rewrite ^/(.*) http://mysite.proj/$1 permanent;
}

Работает нормально, каждый url переписывается на index.php. Но в то же время каждый URL-адрес таблицы стилей, каждый URL-адрес javascript, каждый URL-адрес изображения также переписываются. Как написать правило перезаписи, чтобы не перезаписывать URL-адреса для файлов css, js, изображений?

У вас нет корневого набора в контексте сервера, где находится if, поэтому он использует значение по умолчанию <префикс установки> / html. Вы должны переместить корень в контекст сервера и отключить if для файла try_files. Кроме того, нет причин фиксировать запрос при перенаправлении без www, поскольку исходный запрос уже хранится в $ request_uri.

server {
    listen 80;
    server_name www.mysite.proj;
    # Permanent redirect to no-www
    return 301 http://mysite.proj$request_uri;
}

server {
    listen 80;
    server_name mysite.proj;

    root /path/to/mysite.proj/www;
    index index.php index.html index.htm;

    access_log /path/to/mysite.proj/data/logs/access.log;
    error_log  /path/to/mysite.proj/data/logs/error.log;

    location / {
        # try_files does not preserve query string by default like rewrite
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        # If the requested file doesn't exist, and /index.php doesn't, return a 404
        try_files $uri /index.php =404;

        include        fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_pass   127.0.0.1:8081;
    }
}