我正在尝试为 seo url 创建 htaccess,我创建了 htaccess 所有 url 都工作正常,排除带参数的子文件夹,它们重定向到站点文件夹。
sitefolder
是我的根目录,所有文件都在那里。
示例:网址应如下所示:
http://localhost/sitefolder/subcat/39/web-hosting http://localhost/sitefolder/profile/1/username
在 htaccess 中它是这样的:
RewriteRule ^subcat/(.*)/([a-zA-Z0-9_-]+)$ subcat.php?q=&slug= [L,NC] RewriteRule ^profile/(.*)/([a-zA-Z0-9_-]+)$ show_profile.php?q=&slug= [L,NC]
第一个参数是 id,第二个参数是 slug,但这两个 url 都不会转到 url。
这是我所有的 htacces 代码:
Options +FollowSymLinks -MultiViews RewriteEngine on RewriteRule ^contact-us contact-us.php [L,NC] RewriteRule ^login login.php [L,NC] RewriteRule ^register register.php [L,NC] RewriteRule ^search search.php [L,NC] RewriteRule ^about-us about-us.php [L,NC] RewriteRule ^(.*)/([a-zA-Z0-9_-]+)$ detail.php?q=&slug= [L,NC] RewriteRule ^cats categories.php [L,NC] RewriteRule ^subcat/(.*)/([a-zA-Z0-9_-]+)$ subcat.php?q=&slug= [L,NC] RewriteRule ^profile/(.*)/([a-zA-Z0-9_-]+)$ show_profile.php?q=&slug= [L,NC]
这就是我在 subcat.php
中获取参数的方式,我不会在错误时重定向到索引,所以我不认为这是因为 php :
if(!empty($_GET['slug']) AND !empty($_GET['q'])) { $slug = $_GET['slug']; $pid = is_numeric($_GET['q']); $userQuery = $handler->getPosts("SELECT * FROM categories WHERE catId = ?", [$pid])->fetchAll(); if($userQuery) { foreach($userQuery as $user){ $catid = intval($user['catId']); $cat_title = htmlspecialchars($user['catName']); $cat_seo_url = htmlspecialchars($user['cat_seo_url']); $cat_descriptions = htmlspecialchars($user['cat_desc']); $cat_keywords = htmlspecialchars($user['cat_keys']); $cat_created = htmlspecialchars($user['cat_created_at']); $cat_img = htmlspecialchars($user['cat_img']); } }else{ echo "Something went wrong while execute query."; exit(); } }else{ echo "Something went wrong with parameters"; exit(); }
如果
subcat.php
被调用(正如您在评论中所述),那么.htaccess
不是问题。但是您发布的任何代码中都没有重定向到index.php
(或任何类型的重定向)。但是,此行似乎存在运行时错误:
is_numeric()
只是测试参数是否为数字并返回布尔值,它不会返回该变量的数字值,这正是您所期望的。因此,无论q
的值如何,您的 SELECT 总是会失败(或返回第一项)。您可能需要这样的东西来检索指定 URL 参数的实际值:
但是您需要首先验证这些 URL 参数(即
$_GET
变量)是否已传递,否则您的脚本将发出 E_NOTICE 消息。更新:
与您的
RewriteRule
指令存在冲突:当您请求
http://localhost/sitefolder/subcat/38/web-design
时,它将被此处的第一条规则捕获,该规则将请求重写为detail.php? q=subcat/39&slug=web-design
,而不是您期望的subcat.php
。这可能失败,因为q=subcat/39
可能无效(我猜是触发了到/sitefolder/
的重定向)?您需要更改这些规则的顺序和/或使正则表达式更加具体以避免冲突。例如。如果
q
应该是数字 ID,则仅匹配数字值 (\d
),而不是字面上的 任何内容 (.*),这就是您当前正在匹配的内容。
您还应该在正则表达式中包含字符串结尾锚点,否则这些规则也将匹配重写的 URL 并导致不必要的循环。例如:
我还会质疑此处使用
NC
标志,因为它可能会通过允许contact-us
和CONTACT-US (以及之间的所有内容)访问相同的资源。
摘要
换句话说,你的规则应该更像这样:
(
\w
是[a-zA-Z0-9_]
的简写字符类。)通过使正则表达式更加具体,您可以避免冲突。这些指令从上到下执行。第一个匹配的规则获胜。