fix: the phases after proxy should run when 500 happens before proxy

diff --git a/apisix/init.lua b/apisix/init.lua
index 3586fea..532f53a 100644
--- a/apisix/init.lua
+++ b/apisix/init.lua
@@ -447,6 +447,10 @@
     api_ctx.route_id = route.value.id
     api_ctx.route_name = route.value.name
 
+    local ref = ctxdump.stash_ngx_ctx()
+    core.log.info("stash ngx ctx: ", ref)
+    ngx_var.ctx_ref = ref
+
     -- run global rule
     plugin.run_global_rules(api_ctx, router.global_rules, nil)
 
@@ -544,10 +548,6 @@
     -- run the before_proxy method in access phase first to avoid always reinit request
     common_phase("before_proxy")
 
-    local ref = ctxdump.stash_ngx_ctx()
-    core.log.info("stash ngx ctx: ", ref)
-    ngx_var.ctx_ref = ref
-
     local up_scheme = api_ctx.upstream_scheme
     if up_scheme == "grpcs" or up_scheme == "grpc" then
         return ngx.exec("@grpc_pass")
diff --git a/t/APISIX.pm b/t/APISIX.pm
index 859ae21..72bc093 100644
--- a/t/APISIX.pm
+++ b/t/APISIX.pm
@@ -587,6 +587,7 @@
             more_clear_headers Date;
         }
 
+        # this configuration is needed as error_page is configured in http block
         location \@50x.html {
             set \$from_error_page 'true';
             content_by_lua_block {
diff --git a/t/error_page/error_page.t b/t/error_page/error_page.t
index 70cc34c..981dc36 100644
--- a/t/error_page/error_page.t
+++ b/t/error_page/error_page.t
@@ -198,3 +198,58 @@
 --- grep_error_log_out
 stash ngx ctx
 fetch ngx ctx
+
+
+
+=== TEST 11: check if the phases after proxy are run when 500 happens before proxy
+--- config
+    location /t {
+        content_by_lua_block {
+            local t = require("lib.test_admin").test
+            local code, body = t('/apisix/admin/routes/1',
+                 ngx.HTTP_PUT,
+                 [[{
+                    "plugins": {
+                        "serverless-post-function": {
+                            "functions" : ["return function() if ngx.var.http_x_test_status ~= nil then;ngx.exit(tonumber(ngx.var.http_x_test_status));end;end"]
+                        },
+                        "serverless-pre-function": {
+                            "phase": "log",
+                            "functions" : ["return function() ngx.log(ngx.WARN, 'run log phase in error_page') end"]
+                        }
+                    },
+                    "upstream": {
+                        "nodes": {
+                            "127.0.0.1:1980": 1
+                        },
+                        "type": "roundrobin"
+                    },
+                    "uri": "/*"
+                }]]
+                )
+
+            if code >= 300 then
+                ngx.status = code
+            end
+            ngx.say(body)
+        }
+    }
+--- request
+GET /t
+--- response_body
+passed
+--- no_error_log
+[error]
+
+
+
+=== TEST 12: hit
+--- request
+GET /hello
+--- more_headers
+X-Test-Status: 500
+--- error_code: 500
+--- response_body_like
+.*apisix.apache.org.*
+--- error_log
+run log phase in error_page