在php web应用程序中将URL重写为用户友好名称

问题描述:

我正在开发一个使用PHP5,MySQL的教育应用程序。我使用Slim作为开发网站API和移动应用程序的框架。在php web应用程序中将URL重写为用户友好名称

我有各种数据模型,如问题,测验,主题,话题等。我目前的网站具有以下URL模式:

  • www.site.com/subjects.php?subject_id=1
  • www.site.com/topics.php?topic_id=2
  • www.site.com/quizzes.php?id=3

我通过资源继续URL使用Apache,重写的.htaccess。但是,这仍然不是很清楚。我正在寻找一种解决方案,使我能够实现用户友好和不可预知的url链接。例如

  • www.site.com/subjects/science
  • www.site.com/topics/light-energy
  • www.site.com/quizzes/check-your-grammar-skills

但是......这些数据取决于我的数据库。如果不使用像laravel这样的框架,最好的方法是什么?

+0

当然,我们可以追踪到目前为止。不清楚的是你的具体问题是什么。您目前没有显示任何代码和自己的尝试,因此我们无法说出问题所在。你当然不是在这里问这个问题,让我们为你做你的工作,是吗? – arkascha

+1

你正在使用Slim,对吧?您是否阅读过他们文档的这部分内容https://www.slimframework.com/docs/objects/router.html#how-to-create-routes? – Nima

+0

另外,从您的示例中不清楚在重写过程中实际ID应该来自哪里。像“科学”或“光能”这样的词当然不是身份证。但重写引擎不能_guess_显然没有在URL内命名的ID ... – arkascha

要么你的问题不清楚,要么你还没有真正想过这个......如果你想将漂亮的URL改写成引用数据模型中某个特定对象的内部请求,那么你需要对象的ID在URL内。只是因为HTTP服务器重写逻辑不知何故猜想(通常是数字)ID不知何故。

所以我假设要最终使用的URL沿着这个方案:

对于这种情况你需要重写这样设置:

RewriteEngine on 
RewriteRule ^/?subjects/(\w+)/(\d+)$ /subjects.php?subject=$1&subjectid=$2 [END] 
RewriteRule ^/?topics/(\w+)/(\d+)$ /topics.php?topic=$1&topic_id=$2 [END] 
RewriteRule ^/?quizzes/(\w+)/(\d+)$ /quizzes.php?quizz=$1&id=$2 [END] 

我个人不要为身份证使用不同的名字,但这是一个个人选择的问题,以及你在内部如何匹配的问题,我想。

上述规则集将在http服务器主机配置中工作,同样在某些动态配置文件(“.htaccess”样式文件)内工作。你显然需要加载和激活HTTP服务器重写模块。如果您决定使用动态配置规则,还需要确保它的解释已启用(请参阅文档中的AllowOverride指令),并且该文件位于http主机DOCUMENT_ROOT中,并且服务器进程可以读取该文件。

如果你得到http状态500返回这些URL的请求(“内部服务器错误”),那么你可能会运行一个非常旧的Apache服务器版本。在这种情况下,请尝试使用[L]标志而不是[END]标志。


而且一般提示:你应该总是喜欢在http服务器(虚拟)主机配置,而不是使用动态配置文件(.htaccess风格文件)里这样的规则。这些文件出了名的错误,很难调试,他们真的放慢了服务器。只有当你无法控制主机配置(读取:真正便宜的主机服务提供商)或者如果你有一个依赖编写自己的重写规则的应用程序(这是一个明显的安全噩梦) )。

+0

好的信息。我已经研究过这个话题......虽然不是很深入......当您说“如果您的应用程序依赖于自己的重写规则”,您能解释一下您的意思吗? –

+1

@DigitalWolf相当多的应用程序都有一个内置的逻辑来修改它们的配置。这是由应用程序更改一些动态配置文件完成的。这是灵活的,并允许一个简单的设置,特别是在免费的网络空间服务提供,这通常不会允许您访问您的http服务器主机配置(因为您与成千上万的其他客户共享http服务器)。问题在于,这可能会让攻击者更改应用程序的配置......(例如,wordpress,drupal,nextcloud ......) – arkascha