2010-04-22 113 views
5

我正在开发一个使用PHP和Apache的网站。 我想谈谈我的网址,这些网址如何将动态网址变为静态网址

www.example.com/book.php?book=title

弄成这个样子,如果有可能,当然:

www.example .com/book/title

请注意,书的标题是独特的,不能重复。

我已经阅读了这篇文章,但没有一篇对我这样的初学者来说足够清晰。 你们知道任何解释的教程吗?

谢谢。

回答

0

扩展@ 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&param=$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&param=$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美分在汤中搅拌更多一点。

免责声明: 所有上述重写规则(以及其他所有内容,当然)直接写在我的头顶(几个啤酒之后),并没有经过任何测试。

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框架:大多数情况下,这个功能是内置的。 你必须“学习”如何使用框架。如果您的网站已经完成了,这是不是最好的选择...

2

这里是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会从网址中获得图书的标题,然后搜索数据库或做任何有关该名称的内容。

3

我在静态格式中创建了一个内部链接,例如我的网页中的“http://www.example.com/casestudy/34”。

而且我已经写在.htaccess文件中下面的代码:

Options +FollowSymLinks 
RewriteEngine On 
RewriteBase/

RewriteRule ^casestudy/([^-]+) /casestudy_details.php?id=$1 [R=301,QSA,L]