diff --git a/README.markdown b/README.markdown
index 4689bf5753..2a77876a10 100644
--- a/README.markdown
+++ b/README.markdown
@@ -4999,6 +4999,7 @@ The optional `status` parameter specifies the HTTP status code to be used. The f
* `301`
* `302` (default)
+* `303`
* `307`
It is `302` (`ngx.HTTP_MOVED_TEMPORARILY`) by default.
diff --git a/doc/HttpLuaModule.wiki b/doc/HttpLuaModule.wiki
index f4f14800cf..9dc9cd642a 100644
--- a/doc/HttpLuaModule.wiki
+++ b/doc/HttpLuaModule.wiki
@@ -4164,6 +4164,7 @@ The optional status parameter specifies the HTTP status code to be
* 301
* 302 (default)
+* 303
* 307
It is 302 (ngx.HTTP_MOVED_TEMPORARILY) by default.
diff --git a/src/ngx_http_lua_control.c b/src/ngx_http_lua_control.c
index 249d7632c2..ae36505f9d 100644
--- a/src/ngx_http_lua_control.c
+++ b/src/ngx_http_lua_control.c
@@ -212,10 +212,12 @@ ngx_http_lua_ngx_redirect(lua_State *L)
if (rc != NGX_HTTP_MOVED_TEMPORARILY
&& rc != NGX_HTTP_MOVED_PERMANENTLY
+ && rc != NGX_HTTP_SEE_OTHER
&& rc != NGX_HTTP_TEMPORARY_REDIRECT)
{
return luaL_error(L, "only ngx.HTTP_MOVED_TEMPORARILY, "
- "ngx.HTTP_MOVED_PERMANENTLY, and "
+ "ngx.HTTP_MOVED_PERMANENTLY, "
+ "ngx.HTTP_SEE_OTHER, and "
"ngx.HTTP_TEMPORARY_REDIRECT are allowed");
}
diff --git a/t/022-redirect.t b/t/022-redirect.t
index 57c7add987..fae39e3adf 100644
--- a/t/022-redirect.t
+++ b/t/022-redirect.t
@@ -84,7 +84,7 @@ GET /read
--- response_body_like: 500 Internal Server Error
--- error_code: 500
--- error_log
-only ngx.HTTP_MOVED_TEMPORARILY, ngx.HTTP_MOVED_PERMANENTLY, and ngx.HTTP_TEMPORARY_REDIRECT are allowed
+only ngx.HTTP_MOVED_TEMPORARILY, ngx.HTTP_MOVED_PERMANENTLY, ngx.HTTP_SEE_OTHER, and ngx.HTTP_TEMPORARY_REDIRECT are allowed
@@ -218,3 +218,54 @@ GET /read
Location: http://agentzh.org/foo?a=b&c=d
--- response_body_like: 307 Temporary Redirect
--- error_code: 307
+
+
+
+=== TEST 12: explicit 303
+--- config
+ location /read {
+ content_by_lua_block {
+ ngx.redirect("http://agentzh.org/foo", ngx.HTTP_SEE_OTHER);
+ ngx.say("hi")
+ }
+ }
+--- request
+GET /read
+--- response_headers
+Location: http://agentzh.org/foo
+--- response_body_like: 303 See Other
+--- error_code: 303
+
+
+
+=== TEST 13: explicit 303 with args
+--- config
+ location /read {
+ content_by_lua_block {
+ ngx.redirect("http://agentzh.org/foo?a=b&c=d", ngx.HTTP_SEE_OTHER);
+ ngx.say("hi")
+ }
+ }
+--- request
+GET /read
+--- response_headers
+Location: http://agentzh.org/foo?a=b&c=d
+--- response_body_like: 303 See Other
+--- error_code: 303
+
+
+
+=== TEST 14: explicit 303
+--- config
+ location /read {
+ content_by_lua_block {
+ ngx.redirect("http://agentzh.org/foo?a=b&c=d", 303);
+ ngx.say("hi")
+ }
+ }
+--- request
+GET /read
+--- response_headers
+Location: http://agentzh.org/foo?a=b&c=d
+--- response_body_like: 303 See Other
+--- error_code: 303