用户友好的URL - mod重写和php重定向

no.*_*no. 6 php mod-rewrite friendly-url url-rewriting

到目前为止我已经这样做了:

RewriteBase /
RewriteCond  %{REQUEST_FILENAME} !-f
RewriteCond  %{REQUEST_FILENAME} !-d
RewriteRule  ^(.*)$ index.php?load=$1 [QSA,L]
Run Code Online (Sandbox Code Playgroud)

然后在我的索引页面(在根目录中)我正在使用PHP来确定要加载的页面:

// Swap to variables
    $load = $_GET['load'];

// Home page
    if (!$load || $load == "") { include('home.php'); exit(); }

// Dashboard
    if ($load == "dashboard") { include('dashboard.php'); exit(); }

// About
    if ($load == "about") { include('about.php'); exit(); }

// Username
    $data_array = array(':username' => $load);
    $select_account = $connect->prepare("SELECT * FROM `users` WHERE `username` = :username");
    $select_account-> execute($data_array);
    $account_amount = $select_account->rowCount();
    if ($account_amount > 0) { include('profile.php?name=$load'); exit(); }

// Redirect to 404 if there are no results
    include('404.php'); exit();
Run Code Online (Sandbox Code Playgroud)

到目前为止一切正常,但用户可以将照片上传到图库,我希望他们可以像这样查看:

www.mysite.com/[username]/gallery/
Run Code Online (Sandbox Code Playgroud)

但是如果你打算将其作为url键入,则重写[username]/gallery/为一个部分,这意味着$load = [username]/gallery哪个会给我一个'404'.

可能有一个更好的解决方案来获得理想的结果,但我对.htaccess和重写并不太好.我想补充说我喜欢这个重写因为我有子目录调用,signup并且signin它们也有子目录,但是如果我转到URL:

www.mysite.com/signup
www.mysite.com/signin
Run Code Online (Sandbox Code Playgroud)

它忽略了重写并转到目录而不是通过$load我想要的语句运行它.

另外,需要注意,在注册一个帐户,它匹配的字符串,如任何用户名dashboard或者about等它不允许他们使用它,这将停止用户名和$loadif/else语句和它们包括,被混淆等

编辑

我忘记注意的另一件事是,因为他们可以随意调用图库,它需要搜索以查看该图库是否存在,例如:

www.mysite.com/username/my+first+album
Run Code Online (Sandbox Code Playgroud)

它首先需要检查用户名是否存在,然后检查相册是否存在,然后显示它是否存在,否则404 /重定向到任何地方(如果不存在).所以基本上,两个参数/查询都是动态的.不仅如此,那么该专辑​​中的单张照片需要同样的工作,例如:

www.mysite.com/username/my+first+album/my+picture
Run Code Online (Sandbox Code Playgroud)

我希望这是有道理的...

no.*_*no. 0

在 Aatch 和 Sally 的帮助下,以及一些关于 URL 路由的搜索结果,我得到了以下方法来实现我所追求的目标,所以我想我会与大家分享,以防有人想要使用它......

首先,我需要提及我正在处理的网站位于根文件夹的 2 个子目录内,mysite.com/sub/folder/index.php因此为什么我从 [3] 开始数组

话虽如此,我的 .htaccess 文件如下:

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . sub/folder/index.php [QSA,L]
Run Code Online (Sandbox Code Playgroud)

就我而言,这会获取之后写入的任何内容sub/folder/,并将页面直接重定向回index.php,但是,它会掩盖地址栏中的URL。

它唯一忽略这一点的是子目录是否确实存在。例如,/sub/folder/signup/如果我要在地址栏中键入该文件夹,那么我有一个文件夹,因为该目录存在,那么您不会被重定向到index.php 文件,而是会被发送到所请求的目录,就像正常情况一样。

现在在我的 index.php 文件上(记住我从 $uri[3] 开始,因为我位于子文件夹中!)

$uri = $_SERVER['REQUEST_URI']; // This brings back /sub/folder/foo/bar/test/
$uri = explode("/", $uri); // Separate each one

$var_one = $uri[3]; // foo
$var_two = $uri[4]; // bar
$var_three = $uri[5]; // test

switch ($var_one) {

    case '':
    case 'home':
        include('home.php');
        exit();
        break;

    case 'signout':
    case 'logout':
        include('signout.php');
        exit();
        break;

    case 'dashboard':
    case 'dash':
        include('dashboard.php');
        exit();
    break;

}

// By Username
    $data_array = array(':username' => $var_one);
    $select_account = $connect->prepare("SELECT * FROM `users` WHERE `username` = :username");
    $select_account -> execute($data_array);
    $account_amount = $select_account->rowCount();
    if ($account_amount > 0) { include('profile.php'); exit(); }

// By Account ID
    $data_array = array(':id' => $var_one);
    $select_account = $connect->prepare("SELECT * FROM `users` WHERE `id` = :id");
    $select_account -> execute($data_array);
    $account_amount = $select_account->rowCount();
    if ($account_amount > 0) { include('profile.php'); exit(); }

include('page_not_found.php');
Run Code Online (Sandbox Code Playgroud)

开关案例很简单,如果 url 是:/sub/folder/dashboard/,则显示仪表板.php。如果没有任何案例匹配,那么我们可能正在查看个人资料。首先检查它是否可以是用户名,如果存在则显示查看个人资料页面。然后,它会检查它是否可能是该配置文件的唯一 ID 号,并执行相同的检查。

最后,如果没有从任何一个返回结果,那么我们会看到一个 404 页面未找到页面。

如果它是一个个人资料页面,那么我可以在 profile.php 文件上运行检查$var_two并查看他们是否以该名称上传了相册,例如,/sub/folder/joe/holiday/如果是,则运行查询以获取全部内容,如果没有,则显示消息/重定向或其他任何内容。

然后,如果还有更多,例如,说$var_three该文件夹 ( ) 中的特定图片 ( ) - 然后通过显示结果的类似查询运行它。$var_two/sub/folder/joe/holiday/beach/

这可能不是最好的方法,但它非常简单,一切都按我的意愿进行,所以我不能抱怨。