Forum: NGINX about error_page and named location

Posted by "任晓磊" <julyclyde@gmail.com> (Guest)
on 2012-11-30 03:33
(Received via mailing list)
For rejecting some unfriendly access, I use 410 status code for them. 
The
config is below:

error_page 410 /410;
if (xxx) {
 return 410;
}

location /410 {
 more_set_headers "Content-Type: text/html;charset=utf8;";
return 410 '$remote_addr 禁止访问云云';
}

When I access it for testing purpose, I got
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head><title>410 Gone</title></head>
<body bgcolor="white">
<h1>410 Gone</h1>
<p>The requested resource is no longer available on this server and 
there
is no forwarding address. Please remove all references to this
resource.<hr/>Powered by Tengine
</body>
</html>

If I use error_page 410 @410; and location @410{...} , it works 
correctly,
and serves a page with my own message.

So,
1st, What's the differences between norma location and named location, 
in
this context?
2nd, Are there better ways to serve a html page to unfriendly access, 
and
use nginx's variables in the html? I tried return 410 '$remote_addr
rejected' ,but it gave a application/octet-stream response, browser 
would
download it instead of display the message in browser window. So I have 
to
use more headers module to set Content-Type.
Posted by Maxim Dounin (Guest)
on 2012-11-30 08:52
(Received via mailing list)
Hello!

On Fri, Nov 30, 2012 at 10:33:06AM +0800, 任晓磊 wrote:

> return 410 '$remote_addr 禁止访问云云';
> resource.<hr/>Powered by Tengine
> </body>
> </html>
>
> If I use error_page 410 @410; and location @410{...} , it works correctly,
> and serves a page with my own message.
>
> So,
> 1st, What's the differences between norma location and named location, in
> this context?

Named location is looked up directly, without executing
server-level rewrite module directives again (which in your above
config will return another 410 error, resulting in default error
being returned).

> 2nd, Are there better ways to serve a html page to unfriendly access, and
> use nginx's variables in the html? I tried return 410 '$remote_addr
> rejected' ,but it gave a application/octet-stream response, browser would
> download it instead of display the message in browser window. So I have to
> use more headers module to set Content-Type.

Use text extension to be matched by mime.types, or set
default_type correctly for the location in question
(http://nginx.org/r/default_type).

--
Maxim Dounin
http://nginx.com/support.html
Posted by Ruslan Ermilov (Guest)
on 2012-11-30 11:03
(Received via mailing list)
On Fri, Nov 30, 2012 at 10:33:06AM +0800, 任晓磊 wrote:
> return 410 '$remote_addr 禁止访问云云';
> resource.<hr/>Powered by Tengine
> </body>
> </html>
>
> If I use error_page 410 @410; and location @410{...} , it works correctly,
> and serves a page with my own message.
>
> So,
> 1st, What's the differences between norma location and named location, in
> this context?

This is due to implementation differences in handling internal redirects
and named locations.

When you "return 410" on the server level, "error_page 410 /410" does
an internal redirect to location "/410".  This is processed as a new
request, including running ngx_http_rewrite_module directives specified
on the server level, thus "return 410" fires again.  Because
"recursive_error_pages" is off, standard error page is returned.
(If you turn it on, you'll get 500 instead, due to redirection cycling.)

"error_page 410 @410", on the other hand, does a redirect straight to a
named location "@410", thus the processing skips "server rewrites" and
"find configuration" phases of processing, and you get a custom body
for 410 as expected.

You can avoid these differences by moving what you now have on the
server level to "location /".

> 2nd, Are there better ways to serve a html page to unfriendly access, and
> use nginx's variables in the html? I tried return 410 '$remote_addr
> rejected' ,but it gave a application/octet-stream response, browser would
> download it instead of display the message in browser window. So I have to
> use more headers module to set Content-Type.

Content-Type is controlled by http://nginx.org/r/default_type and
http://nginx.org/r/types directives, for example:

: server {
:     default_type application/octet-stream;
:     types {
:         text/html html;
:     }
:
:     error_page 403 @error;
:
:     location @error {
:         default_type text/plain;
:         types {}
:
:         return 200 'error $status\n';
:     }
: }

: $ echo test > html/test.html
: $ curl -i http://localhost:8000/test.html
: HTTP/1.1 200 OK
: Server: nginx/1.3.9
: Date: Fri, 30 Nov 2012 09:53:35 GMT
: Content-Type: text/html
: Content-Length: 5
: Last-Modified: Fri, 30 Nov 2012 09:53:31 GMT
: Connection: keep-alive
: ETag: "50b8821b-5"
: Accept-Ranges: bytes
:
: test
: $ chmod u-r html/test.html
: $ curl -i http://localhost:8000/test.html
: HTTP/1.1 403 Forbidden
: Server: nginx/1.3.9
: Date: Fri, 30 Nov 2012 09:53:46 GMT
: Content-Type: text/plain
: Content-Length: 10
: Connection: keep-alive
:
: error 403

See also http://nginx.org/en/docs/http/ngx_http_ssi_module.html
Posted by "任晓磊" <julyclyde@gmail.com> (Guest)
on 2012-11-30 17:14
(Received via mailing list)
Thank you all. There are still much to learn for me.

--
侲棬ȶУʱ費
from iPad2 3G

 2012/11/306:03Ruslan Ermilov <ru@nginx.com> д
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.