我正在开发一个使用PHP和Apache的网站。 我想谈谈我的网址,这些网址如何将动态网址变为静态网址
www.example.com/book.php?book=title
弄成这个样子,如果有可能,当然:
www.example .com/book/title
请注意,书的标题是独特的,不能重复。
我已经阅读了这篇文章,但没有一篇对我这样的初学者来说足够清晰。 你们知道任何解释的教程吗?
谢谢。
我正在开发一个使用PHP和Apache的网站。 我想谈谈我的网址,这些网址如何将动态网址变为静态网址
www.example.com/book.php?book=title
弄成这个样子,如果有可能,当然:
www.example .com/book/title
请注意,书的标题是独特的,不能重复。
我已经阅读了这篇文章,但没有一篇对我这样的初学者来说足够清晰。 你们知道任何解释的教程吗?
谢谢。
扩展@ Rodolphe's和@ Galen的回复一点点。
如果您对url重写的需求有限,使用Rodolphe示例中描述的规则的硬编码.htaccess
将会很好地完成。然而,正如Galen所说,你的需求可能是未知的,或者你可能想在以后扩展它们,而不需要触及你的重写规则,一旦你有他们的工作。
一个常见的做法是围绕一个URL方案设计你的应用程序,这个URL方案是www.host.com/controller/action/parameter
。这种URL的一个例子可以是www.host.com/book/view/1
,然后可以通过多种方式在内部进行处理。
1)
您对每个控制器都有单独的脚本。然后,您将每个请求重写为$controller.php?action=$action¶m=$param
,将不匹配或无效的请求重定向到默认控制器。
# Serve files and directories as per usual,
RewriteCond %{REQUEST_URI} !-f
RewriteCond %{REQUEST_URI} !-d
# If the request uri doesn't end in .php
# and isn't empty, rewrite the url
RewriteCond %{REQUEST_URI} !.php$
RewriteCond %{REQUEST_URI} !^$
# Try matching against a param request first
RewriteRule (.*?)/(.*?)/(.*?) $1.php?action=$2¶m=$3 [L]
# If it didn't match, try to match an action
RewriteRule (.*?)/(.*?) $1.php?action=$2 [L]
# redirect all other requests to index.php,
# your default controller
RewriteRule .* index.php [L]
2)
你有一个单一入口点(或前端控制器)到您重定向每一个请求,而这个前端控制器处理重定向请求到合适的控制器。
# Redirect all requests that isn't a file or
# directory to your front controller
RewriteCond %{REQUEST_URI} !-f
RewriteCond %{REQUEST_URI} !-d
RewriteRule .* index.php [L]
通用回退规则不会将任何参数追加到默认/前端控制器。但是,由于它是内部重定向,因此您将有权访问PHP中的REQUEST_URI
以确定您应该执行的操作。
这些当然不是您唯一的选择。只是我的2美分在汤中搅拌更多一点。
免责声明: 所有上述重写规则(以及其他所有内容,当然)直接写在我的头顶(几个啤酒之后),并没有经过任何测试。
你正在寻找的功能被称为“URL重写”
您可以手动做到这一点:你使用正则表达式解释模式,与网络服务器转换它通常下找到请求 与Apache。的.htaccess文件,或在httpd.conf directyl 看到官方文档在这里:http://httpd.apache.org/docs/2.0/misc/rewriteguide.html
它不“即”易于安装,虽然,特别是调试正则表达式
关于您的问题,尝试像一个规则。这个:
RewriteEngine on
RewriteRule ^book/(.*)$ book.php?book=$1 [L]
另一种选择是使用php框架:大多数情况下,这个功能是内置的。 你必须“学习”如何使用框架。如果您的网站已经完成了,这是不是最好的选择...
这里是Kohana的方式(和PHP框架的99.99%),难道
添加一个.htaccess文件(如果使用Apache)
# Turn on URL rewriting
RewriteEngine On
RewriteBase/
# Allow any files or directories that exist to be displayed directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Rewrite all other URLs to index.php/URL
RewriteRule .* index.php/$0 [PT,L]
这会将所有网址重定向到index.php。 index.php为某种前端控制器的加载根据网址
因此,在您的示例脚本:
本地主机/书/标题
的index.php会被加载。它会进入网址并获得页面(控制器)加载,实际上将完成所有工作。在这种情况下可能是books.php。 books.php会从网址中获得图书的标题,然后搜索数据库或做任何有关该名称的内容。
大多数解决方案依赖于mod_rewrite。例如See here。
我在静态格式中创建了一个内部链接,例如我的网页中的“http://www.example.com/casestudy/34”。
而且我已经写在.htaccess文件中下面的代码:
Options +FollowSymLinks
RewriteEngine On
RewriteBase/
RewriteRule ^casestudy/([^-]+) /casestudy_details.php?id=$1 [R=301,QSA,L]