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

Правила перезаписи Nginx, некоторые работают, некоторые нет

Вот два правила перезаписи:

Это работает

rewrite ^/knowledgebase/([0-9]+)/[a-z0-9_-]+.html$ /./knowledgebase.php?action=displayarticle&id=$1 last;

Этот не

rewrite ^/announcements/([0-9]+)/[a-z0-9_-]+.html$ /./announcements.php?id=$1 last;

Насколько я могу судить, разницы между ними нет. URL-адрес, который нужно переписать для объявлений:

/announcements/2/New-Site-Design.html

И следует переписать на:

/announcements.php?id=2

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

=== Добавлен файл конфигурации - мой домен

#HTTP
server {

    listen 80;
    server_name portal2.website.co.uk website.co.uk www.website.co.uk;

    access_log /var/log/nginx/website.access_log;
    error_log /var/log/nginx/website.error_log;

    root /var/www/website.co.uk/www;
    index index.php index.htm index.html;

    location ~ .php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME /var/www/website.co.uk/www$fastcgi_script_name;
        include fastcgi_params;
    }

    rewrite ^/announcements$ /./announcements.php last;
    rewrite ^/announcements/([0-9]+)/[a-z0-9_-]+.html$ /./announcements.php?id=$1 last;

    rewrite ^/knowledgebase$ /./knowledgebase.php last;
    rewrite ^/knowledgebase/([0-9]+)/[a-z0-9_-]+.html$ /./knowledgebase.php?action=displayarticle&id=$1 last;
    rewrite ^/knowledgebase/([0-9]+)/([^/]*)$ /./knowledgebase.php?action=displaycat&catid=$1 last;

    rewrite ^/downloads$ /./downloads.php last;
    rewrite ^/downloads/([0-9]+)/([^/]*)$ /./downloads.php?action=displaycat&catid=$1 last;

}

В приведенном выше файле конфигурации я заменил ссылки на свой домен на «сайт».

=== Редактировать

Вот строка журнала ошибок

2012/06/28 11:40:04 [error] 29095#0: *7 open() "/var/www/website.co.uk/www/announcements/6/Moving-to-a-new-server.html" failed (2: No such file or directory), client: 92.232.232.25, server: portal2.website.co.uk, request: "GET /announcements/6/Moving-to-a-new-server.html HTTP/1.1", host: "portal2.website.co.uk"

Таким образом, правило перезаписи просто не действует для /announcements/id/page-title.html

Moving-to-a-new-server содержит заглавную M, и последнее, что я помню, правила перезаписи чувствительны к регистру.

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

Если да, попробуйте следующее:

rewrite ^/announcements/([0-9]+)/[a-zA-Z0-9_-]+.html$ /./announcements.php?id=$1 last;

и сделайте аналогичное изменение для knowledgebase. Вы могли бы просто использовать .*? вместо конкретного выражения для второй части, поскольку вы на самом деле не собираетесь его нигде использовать (хотя оно соответствует большему количеству символов).

Джей прав в своем ответе о столице M. Причина, по которой запись работает в базе знаний, заключается в том, что эта перезапись соответствует:

rewrite ^/knowledgebase/([0-9]+)/([^/]*)$ /./knowledgebase.php?action=displaycat&catid=$1 last;

И не этот:

rewrite ^/knowledgebase/([0-9]+)/[a-z0-9_-]+.html$ /./knowledgebase.php?action=displayarticle&id=$1 last;

[^/] отрицательное совпадение, что означает совпадение всего не соответствие /, что объясняет, почему ваш запрос /knowledgebase/1/General-Terms-of-Service.html был переписан, но не /announcements/2/New-Site-Design.html