如何通过.htaccess映射/books、/books/及/books/<url_slug>路径?
用.htaccess映射/books、/books/及/books/<url_slug>路径的配置问题
我尝试通过.htaccess将请求映射到/books、/books/或/books/<url_slug>路径,现有配置代码如下:
Options All -Indexes RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^/]+)/?$ $1 [R=301,L] # Map /books/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^books$ book.php [NC,L,QSA]
执行结果:
book.php代码:
<?php echo '<h1>Books</h1>'; ?>
问题分析与修正方案
现有配置仅处理了/books(无尾斜杠)的请求,未覆盖/books/和/books/<url_slug>的场景,且第一条规则会将/books/重定向为/books,若需同时支持三种路径,可按以下方式修改配置:
方案1:支持所有目标路径(不强制无尾斜杠)
注释或移除强制无尾斜杠的规则,添加匹配所有目标路径的规则:
Options All -Indexes RewriteEngine On RewriteBase / # 映射/books、/books/及/books/<url_slug>到book.php RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^books(/.*)?$ book.php [NC,L,QSA]
^books(/.*)?$匹配/books、/books/及任意/books/<url_slug>路径NC忽略大小写,L终止后续规则执行,QSA保留请求的查询字符串
方案2:保留强制无尾斜杠规则(仅排除books路径)
若仍需对其他路径强制无尾斜杠,可添加排除条件:
Options All -Indexes RewriteEngine On RewriteBase / # 排除books路径,其他单级目录强制重定向为无尾斜杠 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !^/books/?$ RewriteRule ^([^/]+)/?$ $1 [R=301,L] # 映射/books、/books/及/books/<url_slug>到book.php RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^books(/.*)?$ book.php [NC,L,QSA]
扩展:在book.php中获取url_slug
若需要处理/books/<url_slug>中的slug参数,可修改book.php:
<?php echo '<h1>Books</h1>'; // 提取url_slug $slug = trim(str_replace('/books', '', $_SERVER['REQUEST_URI']), '/'); if (!empty($slug)) { echo "<p>当前书籍:$slug</p>"; } ?>
内容的提问来源于stack exchange,提问作者Alix Blaine
相关产品推荐
相关产品推荐

