2015-11-06 3 views
2

У меня есть блог, закодированный php с несколькими статьями, но для чтения сообщения URL должен быть как http://myblog/post.php?url=an-article-tilte&id=7.Переписать URL с NGINX

Я хочу сделать самый умный способ доступа к статьям с их URL (и для улучшения ссылок). В моей базе данных каждая статья имеет атрибут url, который содержит его название в 'kebab-case' (например, «Добро пожаловать в мой блог» будет «Добро пожаловать в мой блог»).

Подводя итог, для доступа к сообщению «Добро пожаловать в мой блог» (с идентификатором, равным 7), я бы набрал http://myblog.com/post/welcome-to-my-blog-7, а не http://myblog.com/post.php?url=welcome-to-my-blog&id=7.

В моем файле конфигурации Nginx блоге у меня есть это:

server { 
    listen 80; 
    root /opt/http/nginx/sites/myblog/www; 
    index index.php index.html; 
    server_name myblog.com www.myblog.com; 

    location/{ 
     try_files $uri $uri/ /index.php; 
    } 

    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { 
     expires 365d; 
    } 

    location ~* \.(pdf)$ { 
     expires 30d; 
    } 

    client_max_body_size 3M; 

    error_page 403 /index.php; 

    # pass the PHP scripts to FastCGI server listening on /var/run/php5-fpm.sock 
    location ~ \.php$ { 
     try_files $uri =404; 
     fastcgi_pass unix:/var/run/php5-fpm.sock; 
     fastcgi_index index.php; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     include fastcgi_params; 
    } 

    gzip on; 
    gzip_min_length 1100; 
    gzip_buffers 4 32k; 
    gzip_types text/plain application/x-javascript text/xml text/css; 
    gzip_vary on; 

    access_log /var/log/nginx/www.myblog.access.log; 
    error_log /var/log/nginx/www.myblog.error.log; 
} 

И я предполагаю, что я должен положить внутри что-то вроде этого, но это делает ошибку, когда я пытаюсь перезагрузить Nginx. Поэтому я не знаю, что в этом плохого.

location @rewrites { 
    if ($uri ~* ^/post/([a-zA-Z0-0\-]+)-([0-9]+)) { 
     rewrite ^/post.php?url=$1&id=$2; 
    } 
} 

С apache это было легко, но есть ли способ воспроизвести его на nginx?

ответ

1

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

location /post/ { 
    rewrite ^/post/([\w-]+)-(\d+)$ /post.php?url=$1&id=$2; 
} 

Где:

  • \w эквивалентно [a-zA-Z0-9_] (если вы предпочитаете удалить unescore _ переписать его в расширенной версии)
  • \d is [0-9]

ПРИМЕЧАНИЕ: если вы используете ~* это регистронезависимы матч (двойной A-Za-z не требуется).

UPDATE: если я правильно понимаю, что вам нужно, мы должны переписать правила, чтобы сделать наоборот (сделать запрос на post.php?url={kebab-title}&id={id-number} и фактически получить URL из `` пост/{кебаб-заголовок} - { ID-номер}

location ~ ^/post\.php\?url=(.*)&id=(\d*)$ { 
    alias /post/$1-$2; 
} 

UPDATE 2 , чтобы избежать нежелательных матчей под /post/ вы также можете использовать этот вариант (более конкретно) версия:

location ~ ^/post/((?:\w+-)+\w+)-(\d+)$ { 
    rewrite /post.php?url=$1&id=$2; 
} 
+0

Я поддержал ваш ответ, потому что это именно то, что я искал! И теперь у меня есть ссылка 404 на ссылку 'http: // myblog.com/post/a-example-article-8'. Но я уверен, что мы это разрешим! –

+1

@MaximeLafarie: попробуйте решение, предлагаемое в обновлении, я думаю, это то, что вам нужно. –

+0

Мне очень жаль, ваш первый ответ работает как шарм! Я забыл, что мой блог находится в «блоге», а затем мне пришлось адаптировать ваш ответ с добавлением «/ blog» перед всеми «/» в коде. Я делал это везде, но я забыл сделать это здесь: '/post.php?url=$1 &id=$2;'. Спасибо за ваш ответ, это именно то, что я искал, и благодаря вам я теперь понимаю, как работает nginx url rewriting. –