我希望将网站的页面存储在专用目录中,以使其更易于管理,并将处理程序存储在页面旁边,但是我不希望用户在访问这些页面时看到目录结构。 / p>
例如如果页面存储在https://mywebsite.com/faq/faq.php中,并且用户访问了此页面,我希望他们看到https://mywebsite.com/faq.php
是否可以屏蔽URL或隐藏内部文件结构?我宁愿在PHP或服务器端执行此操作,以免在客户端可见任何此掩蔽
我尝试使用其他SO问题来调查此问题,但似乎没有给出我需要的答案。我已经找到了使用.htaccess的答案,但这似乎只允许拒绝用户访问某些区域。
我也研究了个性网址,但该网址在重定向后仍会更改
答案 0 :(得分:2)
.htaccess是使用RewriteRule最快,最简单的方法,但是,如果您的站点具有数百个链接,那么它将是不可行的,特别是如果您需要继续更新它,因为此过程是手动完成的。
您可以尝试使用缩短的URL。 https://bitly.com/ 这样,您还可以跟踪点击次数。
或者,如果您确实有太多的URL,那么也许您应该创建一个重定向页面。 How to make a redirect in PHP?
答案 1 :(得分:1)
我写了几行代码来帮助您从实现想法开始。
index.php
文件我们需要做的第一件事是在一个地方处理所有请求,在本例中,这是转到位于您的主应用程序文件夹中的index.php
文件。
我们[仍]将继续使用.htaccess
rewriterule
,因此,我们首先向RewriteRule
文件中添加一个基本的.htaccess
,以帮助我们隐藏{ {1}}从URI并通过index.php
文件重定向所有请求:
index.php
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^ index.php [L]
</IfModule>
文件中构建逻辑现在,我们准备开始在index.php
文件中构建逻辑。
我想到的主意是创建一个包含所有应用程序文件夹的index.php
目录,其结构如下:
app
为此,我编写了以下(下面解释)代码并将其插入 app
app\faq
app\faq\faq.php
.htaccess
index.php
:
index.php
此代码实际执行的操作是从请求uri中获取文件名
并在所有<?php
//This function is from: https://www.lucidar.me/en/web-dev/how-to-get-subdirectories-in-php/
function getSubDirectories($dir)
{
$subDir = array();
$directories = array_filter(glob($dir), 'is_dir');
$subDir = array_merge($subDir, $directories);
foreach ($directories as $directory) $subDir = array_merge($subDir, getSubDirectories($directory.'/*'));
return $subDir;
}
function response(string $appDir, string $uri)
{
$currentDir = __DIR__;
$currentDirBaseName = basename($currentDir); //Get the the basename of the current directory
$filename = str_replace('/'.$currentDirBaseName.'/', '', $uri); //Remove the current directory basename from the request uri
if(strpos($filename, '/') > -1) { //If the user is asking for a directory respond with an exception
http_response_code(404);
echo "The requested file was not found.";
}
foreach(getSubDirectories($currentDir.'/'.$appDir) as $dir) { //Iterate through all the subdirerctories of the app directory
$file = $dir.'/'.$filename; //Filename
if(!is_dir($file) && file_exists($file)) { //If the $file exists and is not a directory, `include()` it
include($dir.'/'.$filename);
exit; //or return;
}
}
http_response_code(404);
echo "The requested file was not found.";
}
//Get the request uri
$uri = $_SERVER['REQUEST_URI'];
//Define the app directory
$appDirectory = 'app';
response($appDirectory, $uri);
子目录中查找(递归),如果
找到该文件,它将被$appDirectory
文件include
d保存,否则将显示错误。
注意: :该脚本仅用于演示,仍然需要开发。 例如在某些情况下,您可能在两个不同的目录中拥有两个名称相同的文件,该脚本只会显示找到的第一个文件。
我还建议您阅读"How to build a basic server side routing system in PHP"。