Take the 2-minute tour ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

I just installed lighttpd today and I am having issues with lighttpd always returning a 404 error on the sub directories.

I am trying to install this (h5ai) and I've followed the directions to the latter.

This is the line in the configuration for lighttpd

index-file.names            = ( "index.php", "index.html",
                                "index.htm", "default.htm",
                                "lighttpd/index.html", "_h5ai/server/php/index.php" )

From what I understand for this configuration is that it'll load all the above directories and search for an index file in either of them and display it when it's requested. So I don't see a problem with this.

The main page works fine : www.example.com however as you can see at the site when you go to a sub-directory you immediately get a 404 error. Which is weird as the directory actually does exist.

This is my lighttpd.conf

# lighttpd configuration file
#
# use it as a base for lighttpd 1.0.0 and above
#
# $Id: lighttpd.conf 8860 2008-08-05 10:56:16Z engy $

############ Options you really have to take care of ####################

## modules to load
# at least mod_access and mod_accesslog should be loaded
# all other module should only be loaded if really neccesary
# - saves some time
# - saves memory
server.modules              = (
#                               "mod_rewrite",
#                               "mod_redirect",
#                               "mod_alias",
                                "mod_access",
#                               "mod_cml",
#                               "mod_trigger_b4_dl",
#                               "mod_auth",
#                               "mod_status",
#                               "mod_setenv",
#                               "mod_fastcgi",
#                               "mod_proxy",
#                               "mod_simple_vhost",
#                               "mod_evhost",
#                               "mod_userdir",
                                "mod_cgi",
#                               "mod_compress",
#                               "mod_ssi",
#                               "mod_usertrack",
#                               "mod_expire",
#                               "mod_secdownload",
#                               "mod_rrdtool",
                                "mod_accesslog" )

## a static document-root, for virtual-hosting take look at the
## server.virtual-* options
server.document-root        = "/opt/share/www/www.example.com/"

## where to send error-messages to
server.errorlog             = "/opt/var/log/lighttpd/error.log"

# files to check for if .../ is requested
index-file.names            = ( "index.php", "index.html",
                                "index.htm", "default.htm",
                                "lighttpd/index.html", "_h5ai/server/php/index.php" )

## set the event-handler (read the performance section in the manual)
server.event-handler = "poll" # needed on OS X

# mimetype mapping
mimetype.assign             = (
  ".pdf"          =>      "application/pdf",
  ".sig"          =>      "application/pgp-signature",
  ".spl"          =>      "application/futuresplash",
  ".class"        =>      "application/octet-stream",
  ".ps"           =>      "application/postscript",
  ".torrent"      =>      "application/x-bittorrent",
  ".dvi"          =>      "application/x-dvi",
  ".gz"           =>      "application/x-gzip",
  ".pac"          =>      "application/x-ns-proxy-autoconfig",
  ".swf"          =>      "application/x-shockwave-flash",
  ".tar.gz"       =>      "application/x-tgz",
  ".tgz"          =>      "application/x-tgz",
  ".tar"          =>      "application/x-tar",
  ".zip"          =>      "application/zip",
  ".mp3"          =>      "audio/mpeg",
  ".m3u"          =>      "audio/x-mpegurl",
  ".wma"          =>      "audio/x-ms-wma",
  ".wax"          =>      "audio/x-ms-wax",
  ".ogg"          =>      "application/ogg",
  ".wav"          =>      "audio/x-wav",
  ".gif"          =>      "image/gif",
  ".jpg"          =>      "image/jpeg",
  ".jpeg"         =>      "image/jpeg",
  ".png"          =>      "image/png",
  ".xbm"          =>      "image/x-xbitmap",
  ".xpm"          =>      "image/x-xpixmap",
  ".xwd"          =>      "image/x-xwindowdump",
  ".css"          =>      "text/css",
  ".html"         =>      "text/html",
  ".htm"          =>      "text/html",
  ".js"           =>      "text/javascript",
  ".asc"          =>      "text/plain",
  ".c"            =>      "text/plain",
  ".cpp"          =>      "text/plain",
  ".log"          =>      "text/plain",
  ".conf"         =>      "text/plain",
  ".text"         =>      "text/plain",
  ".txt"          =>      "text/plain",
  ".dtd"          =>      "text/xml",
  ".xml"          =>      "text/xml",
  ".mpeg"         =>      "video/mpeg",
  ".mpg"          =>      "video/mpeg",
  ".mov"          =>      "video/quicktime",
  ".qt"           =>      "video/quicktime",
  ".avi"          =>      "video/x-msvideo",
  ".asf"          =>      "video/x-ms-asf",
  ".asx"          =>      "video/x-ms-asf",
  ".wmv"          =>      "video/x-ms-wmv",
  ".bz2"          =>      "application/x-bzip",
  ".tbz"          =>      "application/x-bzip-compressed-tar",
  ".tar.bz2"      =>      "application/x-bzip-compressed-tar"
 )

# Use the "Content-Type" extended attribute to obtain mime type if possible
#mimetype.use-xattr        = "enable"


## send a different Server: header
## be nice and keep it at lighttpd
# server.tag                 = "lighttpd"

#### accesslog module
accesslog.filename          = "/opt/var/log/lighttpd/access.log"


## deny access the file-extensions
#
# ~    is for backupfiles from vi, emacs, joe, ...
# .inc is often used for code includes which should in general not be part
#      of the document-root
url.access-deny             = ( "~", ".inc" )

$HTTP["url"] =~ "\.pdf$" {
  server.range-requests = "disable"
}

##
# which extensions should not be handle via static-file transfer
#
# .php, .pl, .fcgi are most often handled by mod_fastcgi or mod_cgi
static-file.exclude-extensions = ( ".fcgi", ".php", ".pl", ".py", ".rb" )

######### Options that are good to be but not neccesary to be changed #######

## bind to port (default: 80)
server.port                = 80

## bind to localhost (default: all interfaces)
#server.bind                = "grisu.home.kneschke.de"

## error-handler for status 404
#server.error-handler-404   = "/error-handler.html"
#server.error-handler-404   = "/error-handler.php"

## to help the rc.scripts
server.pid-file            = "/var/run/lighttpd.pid"


###### virtual hosts
##
##  If you want name-based virtual hosting add the next three settings and load
##  mod_simple_vhost
##
## document-root =
##   virtual-server-root + virtual-server-default-host + virtual-server-docroot
## or
##   virtual-server-root + http-host + virtual-server-docroot
##
#simple-vhost.server-root   = "/home/weigon/wwwroot/servers/"
#simple-vhost.default-host  = "grisu.home.kneschke.de"
#simple-vhost.document-root = "/pages/"


##
## Format: <errorfile-prefix><status-code>.html
## -> ..../status-404.html for 'File not found'
#server.errorfile-prefix    = "/home/weigon/projects/lighttpd/doc/status-"

## virtual directory listings
#dir-listing.activate       = "enable"

## enable debugging
debug.log-request-header   = "enable"
debug.log-response-header  = "enable"
debug.log-request-handling = "enable"
debug.log-file-not-found   = "enable"

### only root can use these options
#
# chroot() to directory (default: no chroot() )
#server.chroot              = "/"

## change uid to <uid> (default: don't care)
#server.username            = "nobody"

## change uid to <uid> (default: don't care)
#server.groupname           = "nobody"

#### compress module
#compress.cache-dir         = "/tmp/lighttpd/cache/compress/"
#compress.filetype          = ("text/plain", "text/html")

#### proxy module
## read proxy.txt for more info
#proxy.server               = ( ".php" =>
#                               ( "localhost" =>
#                                 (
#                                   "host" => "192.168.0.101",
#                                   "port" => 80
#                                 )
#                               )
#                             )

#### fastcgi module
## read fastcgi.txt for more info
#fastcgi.server             = ( ".php" =>
#                               ( "localhost" =>
#                                 (
#                                   "socket" => "/tmp/php-fcgi.sock-0",
#                                   "bin-path" => "/opt/bin/php-fcgi",
#                                   "bin-environment" => (
#                                       "PHP_FCGI_MAX_REQUESTS" => "4000"
#                                   )
#                                 )
#                               )
#                            )

#### CGI module
cgi.assign                 = ( ".pl"  => "/opt/bin/perl",
                               ".cgi" => "/opt/bin/perl" )

#### SSL engine
#ssl.engine                 = "enable"
#ssl.pemfile                = "server.pem"
#ssl.ca-file                = "ca.crt"
#ssl.verifyclient.activate  = "enable"
#ssl.verifyclient.enforce   = "enable"
#ssl.verifyclient.depth     = 1

#### status module
#status.status-url          = "/server-status"
#status.config-url          = "/server-config"

#### auth module
## read authentication.txt for more info
#auth.backend               = "plain"
#auth.backend.plain.userfile = "lighttpd.user"
#auth.backend.plain.groupfile = "lighttpd.group"

#auth.backend.ldap.hostname = "localhost"
#auth.backend.ldap.base-dn  = "dc=my-domain,dc=com"
#auth.backend.ldap.filter   = "(uid=$)"

#auth.require               = ( "/server-status" =>
#                               (
#                                 "method"  => "digest",
#                                 "realm"   => "download archiv",
#                                 "require" => "user=jan"
#                               ),
#                               "/server-config" =>
#                               (
#                                 "method"  => "digest",
#                                 "realm"   => "download archiv",
#                                 "require" => "valid-user"
#                               )
#                             )

#### url handling modules (rewrite, redirect, access)
#url.rewrite                = ( "^/$"             => "/server-status" )
#url.redirect               = ( "^/wishlist/(.+)" => "http://www.123.org/$1" )
#### both rewrite/redirect support back reference to regex conditional using %n
#$HTTP["host"] =~ "^www\.(.*)" {
#  url.redirect            = ( "^/(.*)" => "http://%1/$1" )
#}

#
# define a pattern for the host url finding
# %% => % sign
# %0 => domain name + tld
# %1 => tld
# %2 => domain name without tld
# %3 => subdomain 1 name
# %4 => subdomain 2 name
#
#evhost.path-pattern        = "/home/storage/dev/www/%3/htdocs/"

#### expire module
#expire.url                 = ( "/buggy/" => "access 2 hours", "/asdhas/" => "access plus 1 seconds 2 minutes")

#### ssi
#ssi.extension              = ( ".shtml" )

#### rrdtool
#rrdtool.binary             = "/opt/bin/rrdtool"
#rrdtool.db-name            = "/var/www/lighttpd.rrd"

#### setenv
#setenv.add-request-header  = ( "TRAV_ENV" => "mysql://user@host/db" )
#setenv.add-response-header = ( "X-Secret-Message" => "42" )

## for mod_trigger_b4_dl
# trigger-before-download.gdbm-filename = "/home/weigon/testbase/trigger.db"
# trigger-before-download.memcache-hosts = ( "127.0.0.1:11211" )
# trigger-before-download.trigger-url = "^/trigger/"
# trigger-before-download.download-url = "^/download/"
# trigger-before-download.deny-url = "http://127.0.0.1/index.html"
# trigger-before-download.trigger-timeout = 10

## for mod_cml
## don't forget to add index.cml to server.indexfiles
# cml.extension               = ".cml"
# cml.memcache-hosts          = ( "127.0.0.1:11211" )

#### variable usage:
## variable name without "." is auto prefixed by "var." and becomes "var.bar"
#bar = 1
#var.mystring = "foo"

## integer add
#bar += 1
## string concat, with integer cast as string, result: "www.foo1.com"
#server.name = "www." + mystring + var.bar + ".com"
## array merge
#index-file.names = (foo + ".php") + index-file.names
#index-file.names += (foo + ".php")

#### include
#include /etc/lighttpd/lighttpd-inc.conf
## same as above if you run: "lighttpd -f /etc/lighttpd/lighttpd.conf"
#include "lighttpd-inc.conf"

#### include_shell
#include_shell "echo var.a=1"
## the above is same as:
#var.a=1

# Configuration from other optware packages
include_shell "cat /opt/etc/lighttpd/conf.d/*.conf"

This below is the output from error.log when I try to access the directory

GET /test/ HTTP/1.1
Host: www.example.com
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.16 (KHTML, like Gecko) Chrome/24.0.1305.3 Safari/537.16
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
DNT: 1


2012-10-30 09:55:20: (response.c.300) -- splitting Request-URI
2012-10-30 09:55:20: (response.c.301) Request-URI  :  /test/
2012-10-30 09:55:20: (response.c.302) URI-scheme   :  http
2012-10-30 09:55:20: (response.c.303) URI-authority:  www.example.com
2012-10-30 09:55:20: (response.c.304) URI-path     :  /test/
2012-10-30 09:55:20: (response.c.305) URI-query    :
2012-10-30 09:55:20: (response.c.349) -- sanatising URI
2012-10-30 09:55:20: (response.c.350) URI-path     :  /test/
2012-10-30 09:55:20: (mod_access.c.135) -- mod_access_uri_handler called
2012-10-30 09:55:20: (response.c.470) -- before doc_root
2012-10-30 09:55:20: (response.c.471) Doc-Root     : /opt/share/www/www.example.com/
2012-10-30 09:55:20: (response.c.472) Rel-Path     : /test/
2012-10-30 09:55:20: (response.c.473) Path         :
2012-10-30 09:55:20: (response.c.521) -- after doc_root
2012-10-30 09:55:20: (response.c.522) Doc-Root     : /opt/share/www/www.example.com/
2012-10-30 09:55:20: (response.c.523) Rel-Path     : /test/
2012-10-30 09:55:20: (response.c.524) Path         : /opt/share/www/www.example.com/test/
2012-10-30 09:55:20: (response.c.541) -- logical -> physical
2012-10-30 09:55:20: (response.c.542) Doc-Root     : /opt/share/www/www.example.com/
2012-10-30 09:55:20: (response.c.543) Rel-Path     : /test/
2012-10-30 09:55:20: (response.c.544) Path         : /opt/share/www/www.example.com/test/
2012-10-30 09:55:20: (response.c.561) -- handling physical path
2012-10-30 09:55:20: (response.c.562) Path         : /opt/share/www/www.example.com/test/
2012-10-30 09:55:20: (response.c.569) -- file found
2012-10-30 09:55:20: (response.c.570) Path         : /opt/share/www/www.example.com/test/
2012-10-30 09:55:20: (response.c.719) -- handling subrequest
2012-10-30 09:55:20: (response.c.720) Path         : /opt/share/www/www.example.com/test/
2012-10-30 09:55:20: (mod_indexfile.c.150) -- handling the request as Indexfile
2012-10-30 09:55:20: (mod_indexfile.c.151) URI          : /test/
2012-10-30 09:55:20: (mod_access.c.135) -- mod_access_uri_handler called
2012-10-30 09:55:20: (mod_staticfile.c.408) -- handling file as static file
2012-10-30 09:55:20: (mod_staticfile.c.439) not a regular file: /test/ -> /opt/share/www/www.example.com/test/
2012-10-30 09:55:20: (response.c.731) -- subrequest finished
2012-10-30 09:55:20: (response.c.128) Response-Header:
HTTP/1.1 404 Not Found
Content-Type: text/html
Content-Length: 345
Date: Tue, 30 Oct 2012 01:55:20 GMT
Server: lighttpd/1.4.31

I've checked the permissions and it all seems fine as anyone can read the file. So it shouldn't be an issue. lighttpd is ran by the root user and the owner of all the files are also root. I've been googling on this issue and am unable to find a solution hence I'm posting here to see if you guys can help me.

EDIT: After adding a / to "_h5ai/server/php/index.php". This is the error.log output

2012-10-31 01:12:49: (request.c.306) fd: 7 request-len: 390
GET / HTTP/1.1
Host: www.example.com
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.16 (KHTML, like Gecko) Chrome/24.0.1305.3 Safari/537.16
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-GB,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
DNT: 1


2012-10-31 01:12:49: (response.c.300) -- splitting Request-URI
2012-10-31 01:12:49: (response.c.301) Request-URI  :  /
2012-10-31 01:12:49: (response.c.302) URI-scheme   :  http
2012-10-31 01:12:49: (response.c.303) URI-authority:  www.example.com
2012-10-31 01:12:49: (response.c.304) URI-path     :  /
2012-10-31 01:12:49: (response.c.305) URI-query    :
2012-10-31 01:12:49: (response.c.349) -- sanatising URI
2012-10-31 01:12:49: (response.c.350) URI-path     :  /
2012-10-31 01:12:49: (mod_access.c.135) -- mod_access_uri_handler called
2012-10-31 01:12:49: (response.c.470) -- before doc_root
2012-10-31 01:12:49: (response.c.471) Doc-Root     : /opt/share/www/www.example.com/
2012-10-31 01:12:49: (response.c.472) Rel-Path     : /
2012-10-31 01:12:49: (response.c.473) Path         :
2012-10-31 01:12:49: (response.c.521) -- after doc_root
2012-10-31 01:12:49: (response.c.522) Doc-Root     : /opt/share/www/www.example.com/
2012-10-31 01:12:49: (response.c.523) Rel-Path     : /
2012-10-31 01:12:49: (response.c.524) Path         : /opt/share/www/www.example.com/
2012-10-31 01:12:49: (response.c.541) -- logical -> physical
2012-10-31 01:12:49: (response.c.542) Doc-Root     : /opt/share/www/www.example.com/
2012-10-31 01:12:49: (response.c.543) Rel-Path     : /
2012-10-31 01:12:49: (response.c.544) Path         : /opt/share/www/www.example.com/
2012-10-31 01:12:49: (response.c.561) -- handling physical path
2012-10-31 01:12:49: (response.c.562) Path         : /opt/share/www/www.example.com/
2012-10-31 01:12:49: (response.c.569) -- file found
2012-10-31 01:12:49: (response.c.570) Path         : /opt/share/www/www.example.com/
2012-10-31 01:12:49: (response.c.719) -- handling subrequest
2012-10-31 01:12:49: (response.c.720) Path         : /opt/share/www/www.example.com/
2012-10-31 01:12:49: (mod_indexfile.c.150) -- handling the request as Indexfile
2012-10-31 01:12:49: (mod_indexfile.c.151) URI          : /
2012-10-31 01:12:49: (mod_access.c.135) -- mod_access_uri_handler called
2012-10-31 01:12:49: (mod_fastcgi.c.3676) handling it in mod_fastcgi
2012-10-31 01:12:49: (response.c.128) Response-Header:
HTTP/1.1 200 OK
X-Powered-By: PHP/5.4.1
Content-type: text/html
Transfer-Encoding: chunked
Date: Tue, 30 Oct 2012 17:12:49 GMT
Server: lighttpd/1.4.31
share|improve this question

1 Answer 1

up vote 1 down vote accepted

you should change this:

index-file.names            = ( "index.php", "index.html",
                                "index.htm", "default.htm",
                                "lighttpd/index.html", "_h5ai/server/php/index.php" )

to that (adds a beginning slash):

index-file.names            = ( "index.php", "index.html",
                                "index.htm", "default.htm",
                                "lighttpd/index.html", "/_h5ai/server/php/index.php" )

please try to add a line after this line in init.php:

change this:

function normalize_path($path, $trailing_slash = false) {

    $path = str_replace("\\", "/", $path);
    return preg_match("#^(\w:)?/$#", $path) ? $path : (preg_replace('#/$#', '', $path) . ($trailing_slash ? "/" : ""));
}

to this:

function normalize_path($path, $trailing_slash = false) {

    $path = str_replace("\\", "/", $path);
    $path = preg_replace("#/+#", "/", $path);
    return preg_match("#^(\w:)?/$#", $path) ? $path : (preg_replace('#/$#', '', $path) . ($trailing_slash ? "/" : ""));
}

as quick fix for your setup you can change the affected variable to a hardcoded value here:

define("APP_ABS_HREF", normalize_path(dirname(dirname(dirname(getenv("SCRIPT_NAME")))), true));

define("APP_ABS_HREF", normalize_path("/_h5ai/"), true));
share|improve this answer
    
wow, okay confirmed on my local testserver, will have a look into it.. –  lrsjng Oct 30 '12 at 17:13
    
seems that only lighttpd is affected. Apache httpd, nginx and Cherokee work fine.. –  lrsjng Oct 30 '12 at 17:15
    
I see. Are you able to find out where the problem lies? –  Zane Oct 30 '12 at 17:18
    
I updated the answer.. –  lrsjng Oct 30 '12 at 17:24
    
Tried it out. The Main Page now loads but the sub directories are still broken. –  Zane Oct 30 '12 at 17:39

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.