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

Как переписать URI в nginx?

Пожалуйста, обратите внимание на следующую структуру каталогов в моем корне:

/resources/css
/resources/js
/resources/templates
/resources/images

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

rewrite ^/([a-z]+)(.*)$    /index.php?p1=$1&p2=$2;

Например myurl.com/register/... переписан на myurl.com/index.php?p1=register&p2=...

Но это правило также переписывает /resources/, так как мне исключить /resources от переписать? Или мне нужно еще раз переписать? Ничего из того, что я пробовал, похоже, не работает, поэтому очевидно, что я чего-то не понимаю.

Конфигурация ниже - это то, что я обнаружил, что работает, поскольку все операторы местоположения имеют одинаковый приоритет, они проверяются по порядку.

Это помогло мне понять приоритет блоков местоположения:

location =  <path>  (longest match wins)
location ^~ <path>  (longest match wins)
location ~  <path>  (first defined match wins)
location    <path>  (longest match wins)

Вот конфиг:

// match all css/js/images in resource path

location ~ ^/resources {
        root   /mypath/myurl.com;
        try_files $uri =404;
        break;
}

// allow myurl.com/register etc:

location ~  ^/([a-z]+)/(.*)$ {
        root   /mypath/myurl.com;
        rewrite ^/([a-z]+)(.*)$    /index.php?p1=$1&p2=$2;
}

// everything else:

location ~ / {
    root   /mypath/myurl.com;
    index  index.php;
}

Комментарии приветствуются!

Вы можете использовать этот пример:

if ($http_user_agent ~ MSIE) {
  rewrite  ^(.*)$  /msie/$1  break;
}

if ($http_cookie ~* "id=([^;] +)(?:;|$)" ) {
  set  $id  $1;
}

if ($request_method = POST ) {
  return 405;
}

if ($slow) {
  limit_rate  10k;
}

if ($invalid_referer) {
  return   403;
}

if ($args ~ post=140){
  rewrite ^ http://example.com/ permanent;
}

Для получения дополнительной информации посетите: http://wiki.nginx.org/HttpRewriteModule

Вы можете просто добавить другой обработчик местоположения для этого URI, который соответствует существующим файлам - или прерывается, если они этого не делают.

location ~* /resources/(css|js|templates|images) {
  if (!-f $request_filename) {
    break;
  }
  root   /path/to/resources;
}

rewrite ^/([a-z]+)(.*)$    /index.php?p1=$1&p2=$2;