從零手寫實現 nginx-27-return 指令

老马啸西风發表於2024-07-14

前言

大家好,我是老馬。很高興遇到你。

我們為 java 開發者實現了 java 版本的 nginx

https://github.com/houbb/nginx4j

如果你想知道 servlet 如何處理的,可以參考我的另一個專案:

手寫從零實現簡易版 tomcat minicat

手寫 nginx 系列

如果你對 nginx 原理感興趣,可以閱讀:

從零手寫實現 nginx-01-為什麼不能有 java 版本的 nginx?

從零手寫實現 nginx-02-nginx 的核心能力

從零手寫實現 nginx-03-nginx 基於 Netty 實現

從零手寫實現 nginx-04-基於 netty http 出入參最佳化處理

從零手寫實現 nginx-05-MIME型別(Multipurpose Internet Mail Extensions,多用途網際網路郵件擴充套件型別)

從零手寫實現 nginx-06-資料夾自動索引

從零手寫實現 nginx-07-大檔案下載

從零手寫實現 nginx-08-範圍查詢

從零手寫實現 nginx-09-檔案壓縮

從零手寫實現 nginx-10-sendfile 零複製

從零手寫實現 nginx-11-file+range 合併

從零手寫實現 nginx-12-keep-alive 連線複用

從零手寫實現 nginx-13-nginx.conf 配置檔案介紹

從零手寫實現 nginx-14-nginx.conf 和 hocon 格式有關係嗎?

從零手寫實現 nginx-15-nginx.conf 如何透過 java 解析處理?

從零手寫實現 nginx-16-nginx 支援配置多個 server

從零手寫實現 nginx-17-nginx 預設配置最佳化

從零手寫實現 nginx-18-nginx 請求頭+響應頭操作

從零手寫實現 nginx-19-nginx cors

從零手寫實現 nginx-20-nginx 佔位符 placeholder

從零手寫實現 nginx-21-nginx modules 模組資訊概覽

從零手寫實現 nginx-22-nginx modules 分模組載入最佳化

從零手寫實現 nginx-23-nginx cookie 的操作處理

從零手寫實現 nginx-24-nginx IF 指令

從零手寫實現 nginx-25-nginx map 指令

從零手寫實現 nginx-26-nginx rewrite 指令

從零手寫實現 nginx-27-nginx return 指令

從零手寫實現 nginx-28-nginx error_pages 指令

從零手寫實現 nginx-29-nginx try_files 指令

nginx 的 return 指令

nginx 的 return 指令

return 指令是 Nginx 中用於返回特定 HTTP 狀態碼和可選內容的指令。

它通常用於快速響應,控制訪問和重定向等場景。

基本語法

return code [text];
  • code:要返回的 HTTP 狀態碼,例如 200301404 等。

  • text(可選):要返回的內容,通常是一個簡單的字串或重定向 URL。

用法示例

  1. 返回狀態碼

    返回一個簡單的狀態碼,例如 404:

    location /example {
        return 404;
    }
    
  2. 返回狀態碼和內容

    返回狀態碼 200 和一段文字:

    location /hello {
        return 200 "Hello, World!";
    }
    
  3. 重定向

    返回一個重定向(301)到另一個 URL:

    location /old {
        return 301 https://example.com/new;
    }
    
  4. 根據條件返回

    在某些情況下,可以根據特定條件返回不同的狀態碼:

    location /check {
        if ($arg_user = "admin") {
            return 200 "Welcome, Admin!";
        }
        return 403 "Access Denied";
    }
    

注意事項

  • return 指令是一個較為簡單的指令,適合處理簡單的響應。對於更復雜的邏輯,可能需要使用 rewrite 或其他 Nginx 指令。
  • 使用 return 指令會立即結束請求處理,因此不會執行後續的指令或訪問控制模組。

常見場景

  • 防止訪問特定路徑:可以用 return 403; 拒絕對某些路徑的訪問。
  • 舊版 URL 重定向:透過返回 301 狀態碼,將使用者重定向到新版本 URL。
  • 自定義錯誤頁面:可以透過返回特定狀態碼和內容來提供自定義錯誤響應。

java+netty 實現 return

    /**
     * @since 0.24.0
     * @param request 請求
     * @param context 上下文
     * @return
     */
    protected FullHttpResponse buildHttpResponseForReturn(FullHttpRequest request,
                                                   NginxRequestDispatchContext context) {
        logger.info("[Nginx] NginxRequestDispatchReturn request for http={}", request);

        final NginxReturnResult nginxReturnResult = context.getNginxReturnResult();
        HttpResponseStatus responseStatus = HttpResponseStatus.valueOf(nginxReturnResult.getCode(),
                nginxReturnResult.getValue());
        FullHttpResponse response = InnerRespUtil.buildCommonResp(null, responseStatus, request);

        //301
        if(301 == nginxReturnResult.getCode()) {
            response.headers().set(HttpHeaderNames.LOCATION, nginxReturnResult.getValue());
        }

        //TODO: 還有許多,是不是需要特殊處理?
        return response;
    }

相關文章