在 php 网络应用程序中将 URL 重写为用户友好的名称
Rewrite URL as user friendly names in php web app
我正在使用 PHP5、MySQL 开发教育应用程序。我正在使用 Slim 作为框架来为网站和移动应用程序开发 API。
我有各种数据模型,如问题、测验、主题、主题等。我当前的网站有以下 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/科学
- www.site.com/topics/光能
- www.site.com/quizzes/检查你的语法技能
但是...这些数据取决于我的数据库。在不使用像 laravel.
这样的框架的情况下实现这一目标的最佳方法是什么
要么你的问题不清楚,要么你还没有(还)真正想清楚...如果你想将 pretty URLs 重写为一个内部请求,该请求引用你的数据模型中的某个特定对象,那么您确实需要 URL 中的对象 ID。仅仅是因为 http 服务器重写逻辑无法以某种方式猜测(通常是数字)ID。
所以我假设你最终想按照这个方案使用URLs:
- https://www.example.com/subjects/science/123
=> /subjects.php?subject=science&subject_id=123
- https://www.example.com/topics/light-energy/234
=> /topics.php?topic=光能&topic_id=234
- https://www.example.com/quizzes/check-your-grammar-skills/345
=> /quizzes.php?quizz=检查你的语法技能&id=345
对于那种情况,您需要这样的重写集:
RewriteEngine on
RewriteRule ^/?subjects/(\w+)/(\d+)$ /subjects.php?subject=&subjectid= [END]
RewriteRule ^/?topics/(\w+)/(\d+)$ /topics.php?topic=&topic_id= [END]
RewriteRule ^/?quizzes/(\w+)/(\d+)$ /quizzes.php?quizz=&id= [END]
我个人不会为 ID comlumn 使用不同的名称,但我想这是个人选择和内部匹配方式的问题。
以上规则集将在 http 服务器主机配置中工作,同样在一些动态配置文件(“.htaccess
”样式文件)中工作。您显然需要加载并激活 http 服务器重写模块。如果您决定使用动态配置规则,还需要确保它的解释已启用(请参阅文档中的 AllowOverride
指令)并且该文件位于 http 主机 DOCUMENT_ROOT
中并且可读由服务器进程。
如果您对那些 URLs ("internal server error") 的请求返回了 500 的 http 状态,那么很可能您操作的是非常旧版本的 apache http 服务器。在这种情况下,请尝试使用 [L]
标志而不是 [END]
标志。
一般提示:您应该始终更喜欢将此类规则放在 http 服务器(虚拟)主机配置中,而不是使用动态配置文件(.htaccess
样式文件)。众所周知,这些文件容易出错,难以调试,而且它们确实会降低服务器速度。它们仅在您无法控制主机配置(阅读:非常便宜的托管服务提供商)或您的应用程序依赖于编写自己的重写规则(这是一个明显的安全噩梦)的情况下作为最后的选择得到支持).
我正在使用 PHP5、MySQL 开发教育应用程序。我正在使用 Slim 作为框架来为网站和移动应用程序开发 API。
我有各种数据模型,如问题、测验、主题、主题等。我当前的网站有以下 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/科学
- www.site.com/topics/光能
- www.site.com/quizzes/检查你的语法技能
但是...这些数据取决于我的数据库。在不使用像 laravel.
这样的框架的情况下实现这一目标的最佳方法是什么要么你的问题不清楚,要么你还没有(还)真正想清楚...如果你想将 pretty URLs 重写为一个内部请求,该请求引用你的数据模型中的某个特定对象,那么您确实需要 URL 中的对象 ID。仅仅是因为 http 服务器重写逻辑无法以某种方式猜测(通常是数字)ID。
所以我假设你最终想按照这个方案使用URLs:
- https://www.example.com/subjects/science/123
=> /subjects.php?subject=science&subject_id=123 - https://www.example.com/topics/light-energy/234
=> /topics.php?topic=光能&topic_id=234 - https://www.example.com/quizzes/check-your-grammar-skills/345
=> /quizzes.php?quizz=检查你的语法技能&id=345
对于那种情况,您需要这样的重写集:
RewriteEngine on
RewriteRule ^/?subjects/(\w+)/(\d+)$ /subjects.php?subject=&subjectid= [END]
RewriteRule ^/?topics/(\w+)/(\d+)$ /topics.php?topic=&topic_id= [END]
RewriteRule ^/?quizzes/(\w+)/(\d+)$ /quizzes.php?quizz=&id= [END]
我个人不会为 ID comlumn 使用不同的名称,但我想这是个人选择和内部匹配方式的问题。
以上规则集将在 http 服务器主机配置中工作,同样在一些动态配置文件(“.htaccess
”样式文件)中工作。您显然需要加载并激活 http 服务器重写模块。如果您决定使用动态配置规则,还需要确保它的解释已启用(请参阅文档中的 AllowOverride
指令)并且该文件位于 http 主机 DOCUMENT_ROOT
中并且可读由服务器进程。
如果您对那些 URLs ("internal server error") 的请求返回了 500 的 http 状态,那么很可能您操作的是非常旧版本的 apache http 服务器。在这种情况下,请尝试使用 [L]
标志而不是 [END]
标志。
一般提示:您应该始终更喜欢将此类规则放在 http 服务器(虚拟)主机配置中,而不是使用动态配置文件(.htaccess
样式文件)。众所周知,这些文件容易出错,难以调试,而且它们确实会降低服务器速度。它们仅在您无法控制主机配置(阅读:非常便宜的托管服务提供商)或您的应用程序依赖于编写自己的重写规则(这是一个明显的安全噩梦)的情况下作为最后的选择得到支持).