diff --git a/config/apache/rewrites/ebooks.conf b/config/apache/rewrites/ebooks.conf index 617cacaf..fc620da6 100644 --- a/config/apache/rewrites/ebooks.conf +++ b/config/apache/rewrites/ebooks.conf @@ -11,13 +11,13 @@ RewriteRule ^/images/covers/(.+?)\-[a-z0-9]{8}\-(cover|hero)(@2x)?\.(jpg|avif)$ RewriteRule ^/ebooks/(.+?)/download$ /ebooks/download.php?url-path=$1 [QSA] # Misc ebook rewrites. -RewriteRule ^/subjects/([^\./]+?)$ /ebooks/index.php?tags[]=$1 [QSA] -RewriteRule ^/ebooks/([^\./]+?)$ /authors/get.php?url-path=$1 [QSA] -RewriteRule ^/ebooks/([^\./]+?)/downloads$ /bulk-downloads/get.php?author=$1 [QSA] -RewriteRule ^/ebooks/([^\./]+?)/feeds$ /feeds/get.php?author=$1 [QSA] -RewriteRule ^/collections/([^\./]+?)$ /collections/get.php?collection=$1 [QSA] -RewriteRule ^/collections/([^/]+?)/downloads$ /bulk-downloads/get.php?collection=$1 -RewriteRule ^/collections/([^/]+?)/feeds$ /feeds/get.php?collection=$1 +RewriteRule ^/subjects/([^\./]+?)$ /ebooks/index.php?tags[]=$1 [B,QSA] +RewriteRule ^/ebooks/([^\./]+?)$ /authors/get.php?url-path=$1 [B,QSA] +RewriteRule ^/ebooks/([^\./]+?)/downloads$ /bulk-downloads/get.php?author=$1 [B,QSA] +RewriteRule ^/ebooks/([^\./]+?)/feeds$ /feeds/get.php?author=$1 [B,QSA] +RewriteRule ^/collections/([^\./]+?)$ /collections/get.php?collection=$1 [B,QSA] +RewriteRule ^/collections/([^/]+?)/downloads$ /bulk-downloads/get.php?collection=$1 [B] +RewriteRule ^/collections/([^/]+?)/feeds$ /feeds/get.php?collection=$1 [B] RewriteRule ^/ebooks/(.+?)/edit$ /ebooks/edit.php?url-path=$1 [L] RewriteRule ^/ebooks/(.+?)/delete$ /ebooks/delete.php?url-path=$1 [L] diff --git a/www/ebooks/index.php b/www/ebooks/index.php index 6254efcc..c48ea1e8 100644 --- a/www/ebooks/index.php +++ b/www/ebooks/index.php @@ -11,6 +11,7 @@ $sort = Enums\EbookSortType::tryFrom(HttpInput::Str(GET, 'sort') ?? ''); $queryString = ''; $queryStringParams = []; $queryStringWithoutPage = ''; +$pageUrl = '/ebooks'; try{ if($page <= 0){ @@ -34,17 +35,6 @@ try{ $tags = []; } - $result = Ebook::GetAllByFilter($query != '' ? $query : null, $tags, $sort, $page, $perPage, Enums\EbookReleaseStatusFilter::All); - $ebooks = $result['ebooks']; - $totalEbooks = $result['ebooksCount']; - $pageTitle = 'Browse Standard Ebooks'; - $pageHeader = 'Browse Ebooks'; - $pages = ceil($totalEbooks / $perPage); - - if($page > 1){ - $pageTitle .= ', page ' . $page; - } - $pageDescription = 'Page ' . $page . ' of the Standard Ebooks free ebook library'; if($query != ''){ @@ -73,15 +63,44 @@ try{ ksort($queryStringParams); + // If all we did was select one tag, redirect the user to `/subjects/` instead of `/ebooks?tag[0]=`. + if(sizeof($tags) == 1 && $query == '' && preg_match('|^/ebooks|iu', $_SERVER['REQUEST_URI'] ?? '')){ + unset($queryStringParams['tags']); + $queryStringWithoutTags = http_build_query($queryStringParams); + $url = '/subjects/' . $tags[0]; + if($queryStringWithoutTags != ''){ + $url .= '?' . $queryStringWithoutTags; + } + header('Location: ' . $url); + exit(); + } + + // We only have one tag, change the page URL used for back/next links to `/subjects/`. + if(sizeof($tags) == 1 && $query == ''){ + $pageUrl = '/subjects/' . $tags[0]; + unset($queryStringParams['tags']); + } + $queryString = http_build_query($queryStringParams); unset($queryStringParams['page']); $queryStringWithoutPage = http_build_query($queryStringParams); - $canonicalUrl = SITE_URL . '/ebooks'; + $canonicalUrl = SITE_URL . $pageUrl; if($queryString != ''){ - $canonicalUrl .= '?' . $queryString; + $canonicalUrl .= '?' . $queryString; + } + + $result = Ebook::GetAllByFilter($query != '' ? $query : null, $tags, $sort, $page, $perPage, Enums\EbookReleaseStatusFilter::All); + $ebooks = $result['ebooks']; + $totalEbooks = $result['ebooksCount']; + $pageTitle = 'Browse Standard Ebooks'; + $pageHeader = 'Browse Ebooks'; + $pages = ceil($totalEbooks / $perPage); + + if($page > 1){ + $pageTitle .= ', page ' . $page; } if($pages > 0 && $page > $pages){ @@ -119,15 +138,15 @@ catch(Exceptions\AppException $ex){ 0){ ?>