On Sun, Aug 28, 2016 at 06:59:45PM +0200, İhsan Doğan wrote: > On Saturday, 27 Aug 2016 21:50 +0100, Francis Daly wrote:
Hi there, Edho Arief is correct; what you see is due to the "index" directive and the subsequent "php" subrequest. > > What specific test request do you make? > > GET /foo/ with curl: > $ curl https://foo.bar.com/foo/ > > > What file on the filesystem do you want nginx to return? > > UFS (FreeBSD). My question was unclear. What is the output you want to get, instead of the 404? Do you want the content of the file /var/www/foo/index.html? Do you want the php-processed output of the file /var/www/foo/index.php? Do you want something else? > > What does your error.log say about the 404 response? > > 2016/08/28 18:53:32 [error] 22231#0: *11704 open() > "/usr/local/www/foo.bar.com404" failed (2: No such file or > directory), client: 2a02:168:9800::50, server: foo.bar.com, > request: "GET /foo/ HTTP/1.1", host: "foo.bar.com" That is curious output. I do not understand how your config can lead to that output. > server_name foo.bar.com; > root /usr/local/www/foo/bar; > index index.php index.html; > location / { > location ~ ^(.+?\.php)(/.*)?$ { > try_files $1 = 404; > location /foo/ { > alias /var/www/foo/; > } The request for /foo/ is handled in the last location there. It's a directory, so the "index" directive is checked, and the file "index.php" exists, so there is an internal rewrite to /foo/index.php (If the file index.php did not exist, nginx would check for the existence of index.html, and then issue an internal rewrite to /foo/index.html. /foo/index.html would be handled in the /foo/ location, and would try to send the file /var/www/foo/index.html) The request /foo/index.php is handled in the "~ php" location, which says (in this case) "try_files /foo/index.php = 404"; the root directory here is /usr/local/www/foo/bar /usr/local/www/foo/bar/foo/index.php does not exist; /usr/local/www/foo/bar= does not exist, so there is an internal rewrite to the request 404. The request 404 is not handled in any of your locations, so it uses the implicit catch-all and looks for the file /usr/local/www/foo/bar404. Which does not exist, and the error.log should show that. A few things can be changed here: * nginx does not act as you expect as regards the internal rewrite for a directory-request. I suspect that nginx is not going to change on that front. * your "try_files" must end in an argument "=404" if you want it to raise a 404 error. "= 404" is not the same; it *does* lead to a 404 in your case, but only after more processing and for a different reason. * top-level regex locations are usually unwise. One reason is that an (implicit) internal rewrite may be processed in a location you did not expect. To fix things, you will want to decide how each request should be handled; I suspect that the easiest will be if you start by moving the current top-level regex locations to within other locations where possible. Good luck with it, f -- Francis Daly [email protected] _______________________________________________ nginx mailing list [email protected] http://mailman.nginx.org/mailman/listinfo/nginx
