当前位置: 首页 > 知识库问答 >
问题:

在php中怎么禁止www.xxx.com/article/93/cid/16.html23333这种链接能被打开?

杜俊远
2024-10-11

www.xxx.com/article/93/cid/16.html
正常是这样的,但是

www.xxx.com/article/93/cid/16.html?id=2323

就是在正确的后面随便加东西也能正常打开,这个怎么设置?

共有2个答案

洪子晋
2024-10-11

search 查询部分都过滤有点变态了吧。。。

我理解这个代码得写在自定义的拦截器或者代码里面,那就顺着链路找呗。

  1. nginx 或者 Apache 这个入口处
  2. php 的拦截器或者真正处理的位置
  3. js 处理一下

层级越靠上越好,越早拦截损失越小。代码我看上面都有了,哦没有 js 的

if(location.search){
    location.href = location.pathname
}
黄查猛
2024-10-11

这里是几种确保 URL 格式严格匹配的办法:

方法一:使用 PHP 正则表达式验证 URL

通过 PHP 中的正则表达式来验证 URL,确保只允许特定格式的 URL 访问。

<?php
// 获取当前 URL 路径
$request_uri = explode('?', $_SERVER['REQUEST_URI'], 2);
$path = $request_uri[0];

// 定义合法的路径格式
$pattern = '/^\/article\/\d+\/cid\/\d+\.html$/';

// 检查路径是否匹配
if (preg_match($pattern, $path)) {
    // 路径格式正确,处理请求
    echo "合法路径";
} else {
    // 路径格式不正确,返回 404 错误
    http_response_code(404);
    echo "页面未找到";
}
?>

方法二:通过 .htaccess 配置 (适用于 Apache)

使用 Apache 的 .htaccess 文件来设置 URL 重写规则,只允许符合特定格式的 URL 访问。

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/article/\d+/cid/\d+\.html$
RewriteRule ^ - [L,R=404]

方法三:使用 PHP 的 parse_urlfilter_var

通过 PHP 内置的 parse_urlfilter_var 函数来解析和验证 URL。

<?php
$url = "http://www.xxx.com" . $_SERVER['REQUEST_URI'];

// 解析 URL
$parsed_url = parse_url($url);
$path = $parsed_url['path'];

// 检查路径是否符合格式
if (filter_var($path, FILTER_VALIDATE_REGEXP, [
    "options" => ["regexp" => "/^\/article\/\d+\/cid\/\d+\.html$/"]
])) {
    echo "合法路径";
} else {
    http_response_code(404);
    echo "页面未找到";
}
?>

方法四:使用 URL 路由库 (例如使用 Laravel 框架)

使用现代 PHP 框架如 Laravel,其内置的路由功能可以方便地处理 URL 格式匹配。

Route::get('/article/{articleId}/cid/{cid}.html', function ($articleId, $cid) {
    // 处理请求
    return view('article', ['articleId' => $articleId, 'cid' => $cid]);
})->where(['articleId' => '[0-9]+', 'cid' => '[0-9]+']);

方法五:通过 Nginx 配置 (适用于 Nginx 服务器)

使用 Nginx 的配置文件来设置 URL 路由规则,确保 URL 格式匹配。

server {
    listen 80;
    server_name www.xxx.com;

    location / {
        if ($request_uri !~* "^/article/\d+/cid/\d+\.html$") {
            return 404;
        }
        # 其他配置...
    }
}

这些方法都可以确保只有符合特定格式的 URL 才能被正确处理。你可以选择一个最适合你应用场景的方法进行配置。

 类似资料:
  • 使用指南 - 疑难问题 - 数据缺失或无数据问题 - 网站禁止被iframe加载怎么办? 热力图是通过在iframe中加载用户设置的预览url的方式实现的,因此如果用户设置的预览页面禁止被iframe加载,那热力图固然是无法使用的。 Furthermore, X-Frame-Options must be sent as an HTTP header field and is explicitly

  • 第一个表是医院记录,第二个表是业务人负责的医院,怎么在第一个表增一个“业务员”列,分别从第二个表对应上是哪个业务员?这怎么实现? https://www.chunshu.net/angpu/%E4%B8%B4%E6%97%B6%E4%BA%BA%E5%... 还有一个问题:我想把下面第一个表里的统计到第二个表里,但是就是申请时间统计,比如‘2024/3/1’里就填A在第一张表里所以是2024/3/

  • 我有一个非常简单的测试应用程序,上面有一个webview组件。我正试图阻止链接在浏览器中打开,但“shouldoverrideurlloading”看起来对我不起作用。 有人能帮我看看哪里有错误吗?

  • 问题: impl: @Service public class GraduateCollegeServiceImpl extends ServiceImpl<GraduateCollegeMapper, GraduateCollege> implements IGraduateCollegeService { controller: @Api(tags="各高校") @RestController

  • 这是记录用户下载的表,想统计表内每个文章被下载了几次,也就是需要拿到一个文章ID,然后再求下这个ID出现的次数。

  • http://iapplus.com 进入页面点击article 然后刷新页面后就变成其他的页面了