Почему не применяется это правило перезаписи (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
в результате, по сути, нет никакого переписывания вообще из-за ваших неточных символов подстановки, как я отмечал в первом абзаце.