我想仅使用PHP为我的网站脚本创建友好的网址,现在我正在使用查询样式(例如:index.php?location = register),我想将它们转换为这样的内容:
https://www.sitename.com/index.php/Register
现在我正在使用基于$ _GET的函数来解析并包含基于$ _GET值的php脚本。
$includeDir = ".".DIRECTORY_SEPARATOR."assets/controllers".DIRECTORY_SEPARATOR;
$includeDefault = $includeDir."Home.php";
if(isset($_GET['ajaxpage']) && !empty($_GET['ajaxpage'])){
$_GET['ajaxpage'] = str_replace("\0", '', $_GET['ajaxpage']);
$includeFile = basename(realpath($includeDir.$_GET['ajaxpage'].".php"));
$includePath = $includeDir.$includeFile;
if(!empty($includeFile) && file_exists($includePath)) {
include($includePath);
}
else{
include($includeDefault);
}
exit();
}
if(isset($_GET['location']) && !empty($_GET['location']))
{
$_GET['location'] = str_replace("\0", '', $_GET['location']);
$includeFile=basename(realpath($includeDir.$_GET['location'].".php"));
$includePath = $includeDir.$includeFile;
if(!empty($includeFile) && file_exists($includePath))
{
include($includePath);
}
else
{
include($includeDefault);
}
}
else
{
include($includeDefault);
}
亲切的问候!
答案 0 :(得分:2)
好的,我的评论不断增长......所以我想我只会提供答案......
1)这仍然需要服务器配置。在Apache的情况下,我相信它被称为MultiView。这是允许Apache在找不到第一个路径/file.php/somepage时查找目录的原因...如果你没有正确的配置,即使file.php存在,它也只会出现404错误。因此,如果您的目的是避免使用服务器配置,那么它将无法正常工作。
2)你在做什么是危险的:
list1.add(1);
list1.add(2);
list1.add(3);
list2.insert(3);
list2.insert(2);
list2.insert(1);
我所要做的就是知道你的某些文件在哪里,我可能会导致你的一个PHP文件运行......例如。每隔5分钟运行你的夜间cron并淹没你的服务器或其他一些可能造成损害的页面...你需要某种方式强制只包含具有特定名称的文件......例如。
$includeFile = basename(realpath($includeDir.$_GET['ajaxpage'].".php"));
通过强制将Controller的后缀添加到文件名中,您只需确保不要在文件名末尾使用名称Controller来查找您不希望包含的任何文件。
3)有很多MV *风格的框架......并且有很多安全性考虑等等,在你理解它们中的很多或大部分之前创建自己的框架并不总是明智的。即使您不喜欢它们,使用这些框架也可以帮助您学习创建自己的最佳实践。
4)最后,世界上什么是避免使用URL重写的原因。 URL重写是Apache和Windows创建干净URL的标准。有一个原因是“每个人都这样做”。如果它的性能,你的方式实际上可能会更慢,因为apache首先必须查看路径是否存在,然后上一个目录,看看该文件是否存在,然后上去另一个目录,看看该文件是否存在,直到它命中一场比赛......然后打开那个文件。
答案 1 :(得分:1)
为什么需要在URL中显示index.php?
如果您真的想要干净的网址,我会创建我的网址,使其看起来像https://www.sitename.com/register
,但您需要使用类似重写的内容。
但您需要使用.htaccess
或Apache config
这样的规则。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/?$ index.php?location=$1 [L]
然后在您的PHP代码中,您可以执行一个get on location var $_GET["location"]
,然后从发送的值加载页面。
$_GET["location"]
的结果将来自此网址register
,然后您将显示该页面。
我不建议使用MultiViews,因为如果您的文件和文件夹名称相同,可能会导致问题。例如/admin and admin.php
。