首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Htaccess不允许访问带有参数的子目录

Htaccess不允许访问带有参数的子目录
EN

Stack Overflow用户
提问于 2022-04-28 23:14:07
回答 1查看 69关注 0票数 2

我正试图为seo urls创建一个htaccess,我创建了我的htaccess所有的urls都可以很好地排除带有参数的子文件夹,它们重定向到站点文件夹。

sitefolder是我的根目录,所有的文件都在那里。

示例: Url应该如下所示:

代码语言:javascript
复制
  http://localhost/sitefolder/subcat/39/web-hosting
  http://localhost/sitefolder/profile/1/username

在htaccess中,它是这样的:

代码语言:javascript
复制
 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。

这是我所有的密码:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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();
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-28 23:48:52

如果正在调用subcat.php (正如您在评论中所指出的那样),那么.htaccess就没有问题。但是在您发布的任何代码中都没有重定向到index.php (或任何类型的重定向)。

但是,这一行似乎存在运行时错误:

代码语言:javascript
复制
$pid = is_numeric($_GET['q']);

is_numeric()只是测试参数是否是数字的,并返回一个bool,它没有返回该变量的数值,这似乎是您所期望的。因此,无论q的值如何,SELECT总是会失败(或者返回第一项)。

您可能需要这样的东西来检索指定URL参数的实际值:

代码语言:javascript
复制
$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并导致不必要的循环。例如:

代码语言:javascript
复制
RewriteRule ^contact-us$ contact-us.php [L,NC]

我还会在这里质疑NC标志的使用,因为它允许contact-usCONTACT-US (以及两者之间的一切)访问相同的资源,从而可能造成重复的内容问题。

摘要

换句话说,您的规则应该更像这样:

代码语言:javascript
复制
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更加具体,您可以避免冲突。指令从上到下执行。第一条规则是匹配的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72051172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档