2

On my Raspberry Pi Zero-W I like to control my GPIO in and outputs with a webserver. I chose lighttpd as server since I can use cgi scrips with c++.

But my setup has issues. I configured lighttpd without problem. Normal HTML pages are running without problem. I used the command "lighty-enable-mod cgi" as mentioned on the default welcome page to enable cgi scripts.

I made a small C++ test program:

#include <iostream>
using namespace std;
int main()
{
    cout<<"Content-type: text/plain"<<endl<<endl;
    cout<<"Hello World!"<<endl;
 
    return 0;
}

I compile it with G++ rename the binary output to hello.cgi and place this file in the directory /usr/www/cgi-bin/.

I restart lighttpd and on my pc I type the IP address of my Pi in the web browser and get the default welcome page. the I extend my the web browsers address with /hello.cgi and get error 404 Not Found.

Then I saw a web page telling me to change lighttpd.conf. So did I:

server.modules = (
    "mod_access",
    "mod_cgi",
    "mod_alias",
    "mod_accesslog",
    "mod_compress",
    "mod_redirect",
)

server.document-root        = "/var/www/html"
server.upload-dirs          = ( "/var/cache/lighttpd/uploads" )
server.errorlog             = "/var/log/lighttpd/error.log"
server.pid-file             = "/var/run/lighttpd.pid"
server.username             = "www-data"
server.groupname            = "www-data"
server.port                 = 80


index-file.names            = ( "index.php", "index.html", "index.lighttpd.html" )
url.access-deny             = ( "~", ".inc" )
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )

compress.cache-dir          = "/var/cache/lighttpd/compress/"
compress.filetype           = ( "application/javascript", "text/css", "text/html", "text/plain" )

# default listening port for IPv6 falls back to the IPv4 port
include_shell "/usr/share/lighttpd/use-ipv6.pl " + server.port
include_shell "/usr/share/lighttpd/create-mime.assign.pl"
include_shell "/usr/share/lighttpd/include-conf-enabled.pl"

$HTTP["url"] =~ "/cgi-bin/" {
    cgi.assign = ( "" => "" )
}

cgi.assign     = (
    ".cgi" => ""
)

I still get error 404 Not found.

What am I doing wrong? Should I use an other URL? Should I use an other lighttpd.conf ? Should I put my cgi executable file in an other location than /usr/www/cgi-bin/ ?

R. Warning
  • 21
  • 1
  • 1
  • 2

2 Answers2

2

You need indicate where actually the "cgi-bin" path is, by adding the line below:

alias.url += ( "/cgi-bin" => "/usr/www/cgi-bin/" )

Don't forget make .cgi file executable.

Then access your cgi by host/cgi-bin/xxx.cgi.

Greenonline
  • 2,969
  • 5
  • 27
  • 38
Owl City
  • 121
  • 4
0

If you were accessing the cgi as http://host/cgi-bin/hello.cgi, then according to your config, the cgi-bin would be expected under your document-root (that is '/var/www/html/cgi-bin/'). The rule will match the /cgi-bin/ in the URL, but won't be able to find the sub-dir.

Thus, you either need to move your cgi-bin under the document-root, or create an alias as @Owl City suggested.