ホームページ > 運用・保守 > Nginx > nginx書き換え機能の使い方

nginx書き換え機能の使い方

WBOY
リリース: 2023-05-17 13:49:32
転載
3452 人が閲覧しました

    まえがき

    Web サイトを閲覧するときに、www.abc.com または www.abcd.com と入力することに気づきましたか?場合によっては、ページには www.abc.com のホームページ コンテンツが正常に表示されます。 nginx rewriteの利用シナリオです。

    rewrite の概要

    rewrite は Nginx サーバーが提供する重要な基本機能であり、主な機能は URL アドレスの書き換えを実現することです

    rewrite 関数実装は pcre のサポートに依存します。そのため、Nginx サーバーをコンパイルしてインストールする前に、pcre ライブラリをインストールする必要があります (nginx は ngx_http_rewrite_module モジュールを使用して、Rewrite 関数の関連構成を解析および処理します)

    リライトの使用法を真に理解する前に、包括的なシステムが必要ですリライトに関連する命令と構文を学習します。1 つずつ学習しましょう。

    リライトのルールと命令

    set命令

    この命令は、新しい変数を設定するために使用されます。

    nginx書き換え機能の使い方

    • 変数、変数名、変数名は変数の最初の文字として「$」を使用する必要があり、一緒に使用することはできません。 Nginx サーバー デフォルトのグローバル変数は同じ名前です;

    • value: 文字列、他の変数、または変数の組み合わせなどの変数値;

    簡単なケース

    server {
        listen 8081;
        server_name localhsot;
        location /server {
                set $name zhangsan;
                set $age 19;
                default_type text/plain;
                return 200 $name=$age;
        }
    }
    ログイン後にコピー

    nginx サービスを再起動し、ブラウザにアクセスして効果を観察します

    nginx書き換え機能の使い方

    #以下は一般的に使用される Rewrite Global 変数のリストです。

    これらの変数は、使用中に自社のビジネスに応じて柔軟に選択できます。

    #変数

    説明$args変数は、リクエストの指示をリクエスト URL に保存します。たとえば、http://IP:8080?arg1=value1&args2=value2 の「arg1=value1&arg2=value2」は、$query_string$http_user_agent を使用して Cookie データを追加できます。 ##$server_addrサーバーは変数に格納されます#$server_name#$server_port変数には、クライアント要求が到着するサーバーのポート番号が格納されます$server_protocol変数には、サーバーのバージョンが格納されます「HTTP/1.1」などのクライアント要求プロトコル 変数には、バックエンド サーバーに送信されるローカル ファイル リソースの名前が格納されます#$request_method#変数には、「GET」、「POST」などのクライアントのリクエスト メソッドが格納されます。$request_filename変数には、現在リクエストされているリソース ファイルのパス名が格納されます$request_uri変数には、現在のリクエストの URI が格納されますhttp://IP/server?id=10&name=zhangsan の「/server?id=10&name=zhangsan name」などのリクエスト パラメータを運びます。

    我们来随机测试下几个指令的使用吧

    $args

    server {
        listen 8081;
        server_name localhsot;
        location /server {
                set $name zhangsan;
                set $age 19;
                default_type text/plain;
                return 200 $name=$age=$args;
        }
    }
    ログイン後にコピー

    nginx書き換え機能の使い方

    nginx書き換え機能の使い方

    nginx書き換え機能の使い方

    其他的指令有兴趣的同学可以自行尝试,下面使用这些指令完成一个需求

    自定义日志输出格式,将请求的日志输出到自定义的日志中

    具体配置如下:

    log_format main '$remote_addr - $request - $status - $request_uri - $http_user_agent';
       server {
            listen 8081;
            server_name localhsot;
            location /server {
                    access_log logs/access-server.log main;
                    set $name zhangsan;
                    set $age 19;
                    default_type text/plain;
                    return 200 $name=$age=$args=$http_user_agent;
            }
        }
    ログイン後にコピー

    通过这种方式,就可以实现自定义请求的相关参数输出到自定义的日志文件中

    nginx書き換え機能の使い方

    if指令

    该指令用来支持条件判断,并根据条件判断结果选择不同的Nginx配置

    nginx書き換え機能の使い方

    condition为判定条件,可以支持以下写法:

    1)变量名称,如果变量名对应的值为空或者是0,if都判断为false,其他条件为true

    if ($param) { 
    
    }
    ログイン後にコピー
    location /testif {
                    set $username 'zhangsan';
                    default_type text/plain;
                    if ($username){
                            return 200 success;
                    }
                    return 200 'params is empty';
    }
    ログイン後にコピー

    nginx書き換え機能の使い方

    2) 使用"=“和”!="比较变量和字符串是否相等,满足为true,不满足为false

    if ($request_method = POST) { 
     return 405; 3
    }
    ログイン後にコピー

    注意:此处和Java不一样的是字符串不需加引号

    3)使用正则表达式对变量匹配

    • 匹配成功返回true,否则返回false;

    • 变量与正则表达式之间使用"“,”“,”!“,”!"来连接;

    • “~” 代表匹配正则表达式过程中区分大小写;

    • "~*"代表匹配正则表达式过程中不区分大小写;

    • "!“和”!*"刚好和上面取相反值,如果匹配上返回false,匹配不上返回true;

    if ($http_user_agent ~ MSIE) {
        #$http_user_agent的值中是否包含MSIE字符串,如果包含返回 true 
    }
    ログイン後にコピー

    注意:正则表达式字符串一般不需要加引号,但是如果字符串中包含"}“或者是”;"等字符时,就需要把引号加上

    if ($http_user_agent ~ Safari){
                            return 200 Chrome;
      }
    ログイン後にコピー

    nginx書き換え機能の使い方

    4)判断请求文件是否存在使用"-f"和"!-f"

    • 当使用"-f"时,如果请求的文件存在返回true,不存在返回false;

    • 当使用"!f"时,如果请求文件不存在,但该文件所在目录存在返回true,文件和目录都不存在返回false,如果文件存在返回false;

    if (-f $request_filename){
        #判断请求的文件是否存在
    }
    
    if (!-f $request_filename){
        #判断请求的文件是否不存在
    }
    ログイン後にコピー

    案例展示

    location /file {
                    root html;
                    default_type text/html;
                    if (!-f $request_filename){
                            return 200 &#39;<h2>not find file</h2>&#39;;
                    }
            }
    ログイン後にコピー

    当访问目录下不存在的文件时,将会看到如下的异常返回

    nginx書き換え機能の使い方

    5) 判断请求的目录是否存在使用"-d"和"!-d"

    • 当使用"-d"时,如果请求的目录存在,if返回true,如果目录不存在则返回false;

    • 当使用"!-d"时,如果请求的目录不存在但该目录的上级目录存在则返回true,该目录和它上级目录都不存在则返回false,如果请求目录存在也返回false;

    使用"-e"和"!-e"来检查所请求的目录或文件是否存在

    • 当使用"-e",如果请求的目录或者文件存在时,if返回true,否则返回false;

    • 当使用"!-e",如果请求的文件和文件所在路径上的目录都不存在返回true,否则返回false;

    7) 判断请求的文件是否可执行使用"-x"和"!-x"

    • 当使用"-x",如果请求的文件可执行,if返回true,否则返回false;

    • 当使用"!-x",如果请求文件不可执行,返回true,否则返回false; break指令

    该指令用于中断当前相同作用域中的其他Nginx配置。在Nginx的配置中,与该指令处于相同作用域的指令中,位于该指令之前的配置生效,位于之后的配置则无效

    nginx書き換え機能の使い方

    location /{
        if ($param){
    
            set $id $1;
            break;
            limit_rate 10k;
        }
    }
    ログイン後にコピー

    案例演示

    location /break {
                    default_type text/plain;
                    set $username MIKE;
                    if ($args){
                            set $username JIM;
                            break;
                            set $username JODAN;
                    }
                    return 200 $username;
            }
    ログイン後にコピー

    nginx書き換え機能の使い方

    return指令

    该指令用于完成对请求的处理,直接向客户端返回响应状态代码。在return后的所有Nginx配置都是无效的

    nginx書き換え機能の使い方

    • code,为返回给客户端的HTTP状态代理。可以返回的状态代码为0~999的任意HTTP状态代理;

    • text:为返回给客户端的响应体内容,支持变量的使用;

    • URL:为返回给客户端的URL地址;

    location /return {
                    default_type application/json;
                    return 200 &#39;{id:1,name:jike}&#39;;
            }
    ログイン後にコピー

    nginx書き換え機能の使い方

    rewrite指令

    该指令通过正则表达式的使用来改变URI。URL可以同时匹配并处理一个或多个指令,按照顺序进行处理

    URL和URI的区别

    • URI:统一资源标识符

    • URL:统一资源定位符

    nginx書き換え機能の使い方

    • regex,用来匹配URI的正则表达式;

    • 替换:在匹配成功后,用于替换被截取字符串的URI内容。如果该字符串是以"http://"或者"https://"开头的,则不会继续向下对URI进行其他处理,而是直接返回重写后的URI给客户端;

    • flag:用来设置rewrite对URI的处理行为,可选值有如下

    last break redirect permanent

    last : 终止继续在本location中处理接收到的URI,并将此处重写的URI作为一个新的URI,使用各location块进行处理。该标志将重写的URI重写在server块中执行,为重写后的URI提供了转入到其他location块的机会;

    break : 将此处重写的URI作为一个新的URI,在本块中继续处理,该标志重写后的地址在当前的location块中执行,不会将新的URI转向其他的location块;

    redirect : 将重写后的URI返回给客户端,状态码为302,指明是临时重定向URI,主要用在replacement变量不是以 “http://”或“https://”开头的情况;

    redirect : 将重写后的URI返回给客户端,状态码为302,指明是临时重定向URI,主要用在replacement变量不是以 “http://”或“https://”开头的情况;

    permanent : 将重写后的URI返回给客户端,状态码为301,指明是临时重定向URI,主要用在replacement变量不是以 “http://”或“https://”开头的情况;

    示例1

    location /rewirte {
                    rewrite ^/rewrite/url\w*$ https://www.baidu.com;
                    rewrite ^/rewrite/(test)/\w*$ /$1;
                    rewrite ^/rewrite/(hello)/\w*$ /$1;
            }
            location /test {
                    default_type text/plain;
                    return 200 "hello success";
            }
    ログイン後にコピー

    示例2

    location /rewirte {
                    rewrite ^/rewrite/url\w*$ https://www.baidu.com;
                    rewrite ^/rewrite/(test)/\w*$ /$1 last;
                    rewrite ^/rewrite/(hello)/\w*$ /$1 last;
            }
            location /test {
                    default_type text/plain;
                    return 200 "hello success";
            }
    ログイン後にコピー

    rewrite_log指令

    该指令配置是否开启URL重写日志的输出功能

    nginx書き換え機能の使い方

    开启后,URL重写的相关日志将以notice级别输出到error_log指令配置的日志文件汇总

    location /rewirte {
    				rewrite_log on;
    				error_log logs/error.log notice;
                    rewrite ^/rewrite/url\w*$ https://www.baidu.com;
                    rewrite ^/rewrite/(test)/\w*$ /$1 last;
                    rewrite ^/rewrite/(hello)/\w*$ /$1 last;
            }
    ログイン後にコピー

    一、rewrite配置域名跳转

    有很多大型网站,在起步的时候,比如域名为 : www.haoyijia.com,但是域名太长所带来的问题就是不方便记忆,于是后面改成 www.hyj.com,问题是,一些老用户之前一直习惯了那个长域名,如何在老用户输入长域名的时候仍然可以跳转到新的短域名上呢?就可以考虑使用rewrite的功能;下面在本地做一下模拟。

    配置步骤:

    1、准备两个域名

    这里我直接在本地模拟2个域名,通过在本地的hosts文件配置下就可以了

    nginx書き換え機能の使い方

    2、配置nginx.conf文件

    server {
    
    		listen 80;
    		server_name www.zcy.com www.zhangcongyi.com;
    		rewrite ^/ http://www.jd.com permanent;
    	}
    ログイン後にコピー

    重启nginx服务,浏览器访问:www.zcy.com 或者www.zhangcongyi.com,观察效果

    nginx書き換え機能の使い方

    nginx書き換え機能の使い方

    nginx書き換え機能の使い方

    nginx書き換え機能の使い方

    二、rewrite配置独立域名

    一个完整的项目包含多个模块,比如购物网站有商品商品搜索模块、商品详情模块、购物车模块等,那么我们如何为每一个模块设置独立的域名。

    server{
    		listen 80;
    		server_name search.hm.com;
    		rewrite ^(.*) http://www.hm.com/bbs$1 last;
    	}
    	server{
    		listen 81;
    		server_name item.hm.com;
    		rewrite ^(.*) http://www.hm.com/item$1 last;
    	}
    	server{
    		listen 82;
    		server_name cart.hm.com;
    		rewrite ^(.*) http://www.hm.com/cart$1 last;
    	}
    ログイン後にコピー

    本地的hosts文件添加如下配置

    nginx書き換え機能の使い方

    重启nginx服务,可以在浏览器访问下观察效果如何

    nginx書き換え機能の使い方

    三、rewrite配置目录合并

    搜索引擎优化(SEO)是一种利用搜索引擎的搜索规则,来提供目的网站的有关搜索引擎内排名的方式;

    我们在创建自己的站点时,可以通过很多种方式有效提供搜索引擎优化的程度,其中有一项就包含URL的目录层级一般不要超过三层,否则的话不利于搜索引擎的搜索也给客户端的输入带来了负担;

    但是将所有的文件放在一个目录下又会导致文件资源管理混乱,并且访问文件的速度也会随着文件增多而慢下来,这两个问题是相互矛盾的,使用rewrite就可以解决上述问题;

    举例,网站中有一个资源文件的访问路径时,比如访问:/server/11/22/33/44/20.html,也就是说20.html存在于第5级目录下,如果想要访问该资源文件,客户端的URL地址就要写成http://www.web.name/server/11/22/33/44/20.html;

    server {
    	listen 80;
    	server_name www.web.com;
    	location /server{
    		root html;
    	}
    }
    ログイン後にコピー

    nginx書き換え機能の使い方

    nginx書き換え機能の使い方

    但是这个是非常不利于SEO搜索引擎优化的,同时客户端也不好记,使用rewrite我们可以进行如下配置:

    server {
    	listen 80;
    	server_name www.web.com;
    	location /server{
    		rewrite ^/server-([0-9]+)-([0-9]+)-([0-9]+)- ([0-9]+)\.html$ /server/$1/$2/$3/$4/$5.html last;
    	}
    }
    ログイン後にコピー

    以上がnginx書き換え機能の使い方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    関連ラベル:
    ソース:yisu.com
    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
    人気のチュートリアル
    詳細>
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート
    ## と同じ機能を持ちます。 #Variable ユーザーがサービスにアクセスするためのプロキシ情報を保存します (ブラウザ経由でアクセスした場合、ブラウザの関連バージョン情報が記録されます)
    $host変数にはアクセスが格納されます。 サーバー
    $document_uri 変数の server_name 値には、現在のアクセス アドレスの URI が格納されます。たとえば、http://IP/server?id=10&name=zhangsan の「/server」は、$uri
    $document_root変数と同じ機能を持ちます。現在のリクエストに対応する場所のルート値です。設定されていない場合、デフォルトで Nginx 独自の HTML ディレクトリの場所になります。
    $content_length変数-Length の値
    $content_type変数は、リクエスト ヘッダーに Content-Type の値を保存します
    $ http_cookie 変数にはクライアントの Cookie 情報が保存されます。add_header Set-Cookie’cookieName=cookieValue’
    $limit_rate変数は、Nginx サーバーのネットワーク接続速度の制限に保存されます。これは、Nginx 構成の limit_rate ディレクティブに設定された値です。デフォルトは 0 (制限なし) です。
    $remote_addr 変数にはクライアントの IP アドレスが格納されます
    $remote_port変数にはクライアントの IP アドレスが格納されますクライアントとサーバー間の接続を確立するためのポート番号
    $remote_user変数にはクライアントのユーザー名が格納されます。これを取得するには認証モジュールが必要です
    $schemeアクセス プロトコルは変数に格納されます
    変数には、クライアント要求が到着するサーバーの名前が格納されます
    #$request_body_file