Почему не применяется это правило перезаписи (nginx)? (пытается настроить WordPress для нескольких сайтов)

Я пытаюсь настроить WordPress (структуру подпапок) с nginx, но у меня проблема с этим правилом перезаписи.

Ниже приведен Apache.htaccess, который я должен перевести в конфигурацию nginx.

RewriteEngine On
RewriteBase /blogs/
RewriteRule ^index\.php$ - [L]

# uploaded files
RewriteRule ^([_0-9a-zA-Z-]+/)?files/(.+) wp-includes/ms-files.php?file=$2 [L]

# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule  ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule  ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]

Ниже то, что я придумал:

server {
    listen 80;
    server_name example.com;
    server_name_in_redirect off;
    expires 1d;

    access_log /srv/www/example.com/logs/access.log;
    error_log /srv/www/example.com/logs/error.log;

    root /srv/www/example.com/public;
    index index.html;

    try_files $uri $uri/ /index.html;

    # rewriting uploaded files
    rewrite ^/blogs/(.+/)?files/(.+) /blogs/wp-includes/ms-files.php?file=$2 last;

    # add a trailing slash to /wp-admin
    rewrite ^/blogs/(.+/)?wp-admin$ /blogs/$1wp-admin/ permanent;

    if (!-e $request_filename) {
        rewrite ^/blogs/(.+/)?(wp-(content|admin|includes).*) /blogs/$2 last;
        rewrite ^/blogs/(.+/)?(.*\.php)$ /blogs/$2 last;
    }

    location /blogs/ {
        index index.php;
        #try_files $uri $uri/ /blogs/index.php?q=$uri&$args;
    }

    location ~ \.php$ {
        include /etc/nginx/fastcgi_params;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /srv/www/example.com/public$fastcgi_script_name;
    }

    # static assets
    location ~* ^.+\.(manifest)$ {
        access_log /srv/www/example.com/logs/static.log; 
    }

    location ~* ^.+\.(ico|ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
        # only set expires max IFF the file is a static file and exists
        if (-f $request_filename) {
            expires max;
            access_log /srv/www/example.com/logs/static.log; 
        }
    }
}

В приведенном выше коде, я считаю, rewrite ^/blogs/(.+/)?(.*\.php)$ /blogs/$2 last; не имеет никакого эффекта, потому что когда я смотрю на файл access_log, я вижу следующую строку:

2010/09/15 01:14:55 [error] 10166#0: *8 "/srv/www/example.com/public/blogs/test/index.php" is not found (2: No such file or directory), request: "GET /blogs/test/ HTTP/1.1"

(Здесь "тест" - это второй блог, созданный с использованием функции мультисайтов). Я ожидаю, что /blogs/test/index.php переписан в /blogs/index.php, но, похоже, он этого не делает...

Я пропускаю что-то очевидное?

Спасибо!

1 ответ

Во-первых, я не думаю, что вы собираетесь сойти с рук, меняя [_0-9a-zA-Z-]+ в .+ в ваших правилах переписывания, но я не думаю, что это вас здесь кусает.

Правило rewrite ^/blogs/(.+/)?(.*\.php)$ /blogs/$2 last; не соответствует /blogs/test/index.php потому что запрос на самом деле для /blogs/test/, index.php не прикрепляется до четырех строк спустя, когда Nginx ищет файл индекса для этого каталога. Если я прав, /blogs/test/ не будет переписан, но /blogs/test/index.php (как положено в адресной строке браузера) будет.

Тем не менее, я думаю, что даже тогда вы можете обнаружить, что (.+/)? часть запроса ничего не соответствует, а (.*\.php) часть соответствует полноте test/index.php в результате, по сути, нет никакого переписывания вообще из-за ваших неточных символов подстановки, как я отмечал в первом абзаце.

Другие вопросы по тегам