我正试图为seo urls创建一个htaccess,我创建了我的htaccess所有的urls都可以很好地排除带有参数的子文件夹,它们重定向到站点文件夹。
sitefolder是我的根目录,所有的文件都在那里。
示例: Url应该如下所示:
http://localhost/sitefolder/subcat/39/web-hosting
http://localhost/sitefolder/profile/1/username在htaccess中,它是这样的:
RewriteRule ^subcat/(.*)/([a-zA-Z0-9_-]+)$ subcat.php?q=$1&slug=$2 [L,NC]
RewriteRule ^profile/(.*)/([a-zA-Z0-9_-]+)$ show_profile.php?q=$1&slug=$2 [L,NC]第一个参数是id,第二个参数是片段,但这两个url都不会转到url。
这是我所有的密码:
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=$1&slug=$2 [L,NC]
RewriteRule ^cats categories.php [L,NC]
RewriteRule ^subcat/(.*)/([a-zA-Z0-9_-]+)$ subcat.php?q=$1&slug=$2 [L,NC]
RewriteRule ^profile/(.*)/([a-zA-Z0-9_-]+)$ show_profile.php?q=$1&slug=$2 [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();
}发布于 2022-04-28 23:48:52
如果正在调用subcat.php (正如您在评论中所指出的那样),那么.htaccess就没有问题。但是在您发布的任何代码中都没有重定向到index.php (或任何类型的重定向)。
但是,这一行似乎存在运行时错误:
$pid = is_numeric($_GET['q']);is_numeric()只是测试参数是否是数字的,并返回一个bool,它没有返回该变量的数值,这似乎是您所期望的。因此,无论q的值如何,SELECT总是会失败(或者返回第一项)。
您可能需要这样的东西来检索指定URL参数的实际值:
$pid = is_numeric($_GET['q']) ? (int)$_GET['q'] : 0;但您需要验证这些URL参数(即。首先传递$_GET vars),否则脚本将发出E_NOTICE消息。
更新:
与您的RewriteRule指令有冲突:
RewriteRule ^(.*)/(a-Za-Z0-9_+)$ detail.php?q=$1&slug=$2 L,NC RewriteRule ^ RewriteRule categories.php L,NC RewriteRule ^subcat/(.*)/(a-zA-Z0-9_-+)$ subcat.php?q=$1&slug=$2 L,NC RewriteRule ^profile/(.*)/(a-zA-Z0-9_-+)$ show_profile.php?q=$1&slug=$2 L,NC
当您请求http://localhost/sitefolder/subcat/38/web-design时,它将被这里的第一条规则捕获,第一条规则将请求重写到detail.php?q=subcat/39&slug=web-design,而不是您所期望的subcat.php。哪一个可能失败,因为q=subcat/39可能是无效的(我猜是触发了重定向到/sitefolder/)?
您需要更改这些规则的顺序和/或使正则表达式更具体,以避免冲突。例如:如果q应该是一个数字id,那么只匹配一个数值(\d+),而不是字面意义上的任何东西(.*),这就是您目前正在匹配的。
RewriteRule ^contact-us contact-us.php L,NC
您还应该在regex上包含字符串结束锚,否则这些规则也将匹配重写的URL并导致不必要的循环。例如:
RewriteRule ^contact-us$ contact-us.php [L,NC]我还会在这里质疑NC标志的使用,因为它允许contact-us和CONTACT-US (以及两者之间的一切)访问相同的资源,从而可能造成重复的内容问题。
摘要
换句话说,您的规则应该更像这样:
RewriteRule ^contact-us$ contact-us.php [L]
RewriteRule ^login$ login.php [L]
RewriteRule ^register$ register.php [L]
RewriteRule ^search$ search.php [L]
RewriteRule ^about-us$ about-us.php [L]
RewriteRule ^cats$ categories.php [L]
RewriteRule ^(\d+)/([\w-]+)$ detail.php?q=$1&slug=$2 [L]
RewriteRule ^subcat/(\d+)/([\w-]+)$ subcat.php?q=$1&slug=$2 [L]
RewriteRule ^profile/(\d+)/([\w-]+)$ show_profile.php?q=$1&slug=$2 [L](\w是[a-zA-Z0-9_]的简写字符类。)
通过使regex更加具体,您可以避免冲突。指令从上到下执行。第一条规则是匹配的。
https://stackoverflow.com/questions/72051172
复制相似问题