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

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

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

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

阅读 1.2k
2 个回答

这里是几种确保 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 才能被正确处理。你可以选择一个最适合你应用场景的方法进行配置。

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

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

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

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

if(location.search){
    location.href = location.pathname
}
推荐问题
宣传栏