如何在htaccess文件中检查只有serviceworker.js可以访问secret.json文件? 主机或IP地址过滤不好。 我正在寻找一个 Vanilla JS 解决方案,只允许服务工作者读取文件
.htaccess 文件
Options All -Indexes
ServerSignature Off
SetEnvIf Referer ".example\.com" localreferer
<FilesMatch "\.json$">
Require all denied
Require env localreferer
</FilesMatch>
SetEnvIf Referer“serviceworker.js”swjsreferer?????? :S
秘密.json
{
'name': 'test'
}
服务工作者.js
await fetch('https://example.com/secret.json', {
}).then(response => {
return response.json();
})
.then(data => {
console.log(data);
})
.catch(error => {
console.log(error);
});
@Arkascha 是对的。 Jani88,为什么不使用“文件管理器”页面来轻松管理这些条件呢?例如,您可以编写一个处理 example.com 站点的 PHP 脚本。您需要将所有请求重定向到
,然后创建一个路由器。其中一条路线可能是index.php
。当我调用secret.json
时,example.com/secret.json
开始运行,检查路径是否为index.php
,验证 IP 地址,如果正确,PHP 可以直接读取 JSON 文件并在响应中返回。如果IP地址不正确,可以输出403错误。/secret.json
.htaccess
PHP
.htaccess
标准,我们禁用目录列表并确保所有请求(包括 /login
、/register
等路径)始终执行特定的 index.php
文件,我们从中处理最终输出。
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews -Indexes
</IfModule>
RewriteEngine On
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
# Send Requests To Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
index.php
根据每个请求运行的主文件。我添加了一些函数以使其更容易理解。目前,它仅以非常基本的方式检查一条路线,只是为了逻辑起见,看看请求的链接是
example.com/secret.json
还是example.com/secret.json/
。如果是这样,在检查 IP 地址后,它会回显 JSON 文件的内容。
<?php
// List of allowed IP addresses
$allowed_ips = ['70.80.70.80'];
// Function to get the client's IP address
function getClientIp() {
return $_SERVER['HTTP_CLIENT_IP'] ?? $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['REMOTE_ADDR'];
}
// Function to send a error response
function abort($code, $message = null) {
$default_messages = [
403 => '403 Forbidden',
404 => '404 Not Found',
];
header("HTTP/1.1 $code " . ($default_messages[$code] ?? 'Error'));
echo $message ?? $default_messages[$code] ?? 'Error';
exit();
}
// Get the requested path
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
// Route the request
if ($path === '/secret.json' || $path === '/secret.json/') {
$client_ip = getClientIp();
// Check if the client's IP address is allowed
if (in_array($client_ip, $allowed_ips)) {
// File path to the JSON file
$file_path = __DIR__ . '/storage/secret.json';
if (file_exists($file_path)) {
header('Content-Type: application/json');
echo file_get_contents($file_path);
} else {
abort(404, 'File Not Found');
}
} else {
abort(403);
}
} else {
abort(404);
}