# 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]
# 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]
# 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]
5条答案
按热度按时间gcxthw6b1#
下面是kohana(以及99.99%的php框架)的做法
添加.htaccess文件(如果使用Apache)
这会将所有url重定向到index.php。index.php将是某种前端控制器,它根据url加载脚本
在你的例子中:
本地主机/图书/标题
index.php将被加载。它将进入url并获取要加载的页面(控制器),该页面实际上将完成所有工作。在这种情况下,可能是books.php. books.php将从url中获取书名,然后搜索数据库或对该名称执行任何操作。
w8ntj3qf2#
我已经创建了一个静态格式的内部链接,比如http://www.example.com/casestudy/34在我的网页中创建了“www.example.com“。
我在.htaccess文件中编写了以下代码:
slhcrj9b3#
您正在寻找的功能称为“URL重写”。
您可以手动执行此操作:你用正则表达式解释这个模式,然后Web服务器翻译请求。在Apache中,它通常在htaccess文件中找到,或者在httpd.conf中的directyl中找到。请参阅官方文档。http://httpd.apache.org/docs/2.0/misc/rewriteguide.html
但是,调试正则表达式并不“那么”容易。
关于您的问题,请尝试以下规则:
另一个选择是使用php框架:大多数时候,这个功能是内置的。你必须“学习”如何使用框架。如果你的网站已经完成,这不是最好的选择...
woobm2wo4#
对“鲁道夫”和“盖伦”的回复进行了一点扩展。
如果您对url重写的需求有限,那么使用Rodolphe示例中描述的硬编码
.htaccess
规则就可以了。然而,正如Galen所建议的,你的需求可能是未知的,或者你可能想在以后扩展它们,而不需要触及你的重写规则,一旦你让它们起作用。
一种常见的方法是围绕
www.host.com/controller/action/parameter
的URL方案设计应用程序。www.host.com/book/view/1
就是这样一个URL方案,它可以在内部以多种方式进行处理。1)的
每个控制器都有单独的脚本,然后将每个请求重写为
$controller.php?action=$action¶m=$param
,将不匹配或无效的请求重定向到默认控制器。2)的
您有一个入口点(或前端控制器),您可以将每个请求重定向到该入口点,并且该前端控制器负责将请求重定向到适当的控制器。
一般回退规则不会将任何参数附加到default/front控制器。但是,由于这是一个内部重定向,您可以访问PHP中的
REQUEST_URI
来确定您应该做什么。当然,这些不是你唯一的选择。只是我的2美分在汤里多搅拌一点。
免责声明:以上所有重写规则(当然还有其他所有规则)都是我直接写出来的(喝了几杯啤酒后),还没有在任何地方测试过。
oxf4rvwz5#
大多数解决方案都依赖于mod_rewrite。例如,See here。