1){ $pageTitle .= ', page ' . $page; } $pageDescription = 'Page ' . $page . ' of the Standard Ebooks free ebook library'; if($query != ''){ $queryStringParams['query'] = $query; } if(sizeof($tags) > 0){ $queryStringParams['tags'] = $tags; } if($view !== null){ $queryStringParams['view'] = $view->value; } if($sort !== null){ $queryStringParams['sort'] = $sort->value; } if($perPage !== EBOOKS_PER_PAGE){ $queryStringParams['per-page'] = $perPage; } if($page > 1){ $queryStringParams['page'] = $page; } ksort($queryStringParams); $queryString = http_build_query($queryStringParams); unset($queryStringParams['page']); $queryStringWithoutPage = http_build_query($queryStringParams); $canonicalUrl = SITE_URL . '/ebooks'; if($queryString != ''){ $canonicalUrl .= '?' . $queryString; } if($pages > 0 && $page > $pages){ throw new Exceptions\PageOutOfBoundsException(); } } catch(Exceptions\PageOutOfBoundsException){ $url = '/ebooks?page=' . $pages; if($queryStringWithoutPage != ''){ $url .= '&' . $queryStringWithoutPage; } header('Location: ' . $url); exit(); } catch(Exceptions\AppException $ex){ // Something very unexpected happened, log and emit 500. http_response_code(Enums\HttpCode::InternalServerError->value); // Internal server error. Log::WriteErrorLogEntry($ex); exit(); } ?> $pageTitle, 'highlight' => 'ebooks', 'description' => $pageDescription, 'canonicalUrl' => $canonicalUrl]) ?>

$query, 'tags' => $tags, 'sort' => $sort, 'view' => $view, 'perPage' => $perPage]) ?>

No ebooks matched your filters. You can try different filters, or browse all of our ebooks.

$ebooks, 'view' => $view]) ?> 0){ ?>

We also have bulk ebook downloads and a list of collections available, as well as ebook catalog feeds for use directly in your ereader app or RSS reader.

0 && $query == '' && sizeof($tags) == 0 && $page == 1){ ?>