如何在 nginx 中重写 URI?

如何在 nginx 中重写 URI?

请考虑我的根目录中的以下目录结构:

/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在重写之外?还是我需要再次重写?我尝试过的所有方法似乎都不起作用,所以显然我不明白其中的道理。

答案1

下面的配置是我发现有效的,因为位置语句都具有相同的优先级,并且它们按顺序进行检查。

这有助于我理解位置块的优先级:

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;
}

欢迎评论!

答案2

您可以使用这个例子:

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

答案3

您可以为该 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;

相关内容