Вернуть страницу 404error.html на веб-сервере C - PullRequest
0 голосов
/ 01 июня 2018

Я написал веб-сервер на языке программирования C и на основании запроса, указанного в URL, веб-сервер полностью извлекает соответствующие веб-страницы!ниже приведена часть кода, которая обрабатывает запросы URL!

if ( strncmp(reqline[1], "/\0", 2)==0 ) 
    reqline[1] = "/index.html";
    //If no file is specified, index.html will be opened by default  

strcpy(path, ROOT); 
strcpy(&path[strlen(ROOT)], reqline[1]); 
printf("file: %s\n", path); 

if ( (fd=open(path, O_RDONLY))!=-1 )    //If a html file is found
{
    send(clients[n], "HTTP/1.0 200 OK\n\n", 17, 0); 
    while ( (bytes_read=read(fd, data_to_send, BYTES))>0 ) 
        write (clients[n], data_to_send, bytes_read);
}
else { //If html file not found
    write (clients[n], "File not found", 15);      
}

Я хочу отобразить мою веб-страницу 404error.html (находится в папке, в которой есть index.html и другие веб-страницы html)когда пользователь указывает URL-адрес несуществующего html-файла вместо текста «Файл не найден», который отображается в данный момент!

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Но я не знаю, что write и send делают в вашей реализации, но всегда нужно соблюдать HTTP,

Response = Status-Line * ((general-header)| заголовок ответа | заголовок объекта) CRLF) CRLF [тело сообщения]

Из кодов состояния в https://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html. Это многообещающая модель с кодом C, http://tinyhttpd.sourceforge.net/.В частности, что не так с вашим http-ответом вообще, насколько я понимаю,

if ( (fd=open(path, O_RDONLY))!=-1 )    //If a html file is found
{
    send(clients[n], "HTTP/1.0 200 OK\n\n", 17, 0); 
}
else { //If html file not found
    send(clients[n], "HTTP/1.0 404 Not Found\n\n", 20, 0);
    fd = fd_404; // assumes fd_404 is always open
}
while ( (bytes_read=read(fd, data_to_send, BYTES))>0 ) 
    write (clients[n], data_to_send, bytes_read);
// rewind or close the file . . .
0 голосов
/ 01 июня 2018

Я не могу скомпилировать или запустить неполный код, но «предположение» было бы отправить файл уведомления об ошибке, если запрошенный файл не найден.Файл «404error.html» должен существовать по доступному пути.

if ( (fd=open(path, O_RDONLY))!=-1 ) {                  // If the file is found
    send(clients[n], "HTTP/1.0 200 OK\n\n", 17, 0); 
    while ( (bytes_read=read(fd, data_to_send, BYTES))>0 ) 
        write (clients[n], data_to_send, bytes_read);
    close(fd);                                          // add this
}
else if ( (fd=open("404error.html", O_RDONLY))!=-1 ) {  // Send the error file
    send(clients[n], "HTTP/1.0 200 OK\n\n", 17, 0); 
    while ( (bytes_read=read(fd, data_to_send, BYTES))>0 ) 
        write (clients[n], data_to_send, bytes_read);
    close(fd);                                          // add this
}
else {
    write (clients[n], "File not found", 15);           // tough luck, back to to you
}

Я не знаю, что такое clients[n], но я уверен, что вы делаете.

Исходный код могбыть более эффективным, не повторяя код передачи, но я оставляю это вам.Этот ответ является идеей.

...