.htaccess 如何将动态URL转换为静态URL

xwmevbvl  于 2022-11-16  发布在  其他
关注(0)|答案(5)|浏览(173)

我正在开发一个网站使用PHP和Apache。我想把我的网址从

www.example.com/book.php?book=标题

如果可能的话,变成这样:

www.example.com/book/title

请注意,书名是唯一的,不能重复。
我读过这方面的文章,但是对于我这样的初学者来说,没有一篇文章足够清楚。你们知道有什么教程可以解释这个吗?

  • 谢谢-谢谢
gcxthw6b

gcxthw6b1#

下面是kohana(以及99.99%的php框架)的做法
添加.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]

这会将所有url重定向到index.php。index.php将是某种前端控制器,它根据url加载脚本
在你的例子中:
本地主机/图书/标题
index.php将被加载。它将进入url并获取要加载的页面(控制器),该页面实际上将完成所有工作。在这种情况下,可能是books.php. books.php将从url中获取书名,然后搜索数据库或对该名称执行任何操作。

w8ntj3qf

w8ntj3qf2#

我已经创建了一个静态格式的内部链接,比如http://www.example.com/casestudy/34在我的网页中创建了“www.example.com“。
我在.htaccess文件中编写了以下代码:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /

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

slhcrj9b3#

您正在寻找的功能称为“URL重写”。
您可以手动执行此操作:你用正则表达式解释这个模式,然后Web服务器翻译请求。在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框架:大多数时候,这个功能是内置的。你必须“学习”如何使用框架。如果你的网站已经完成,这不是最好的选择...

woobm2wo

woobm2wo4#

对“鲁道夫”和“盖伦”的回复进行了一点扩展。
如果您对url重写的需求有限,那么使用Rodolphe示例中描述的硬编码.htaccess规则就可以了。
然而,正如Galen所建议的,你的需求可能是未知的,或者你可能想在以后扩展它们,而不需要触及你的重写规则,一旦你让它们起作用。
一种常见的方法是围绕www.host.com/controller/action/parameter的URL方案设计应用程序。www.host.com/book/view/1就是这样一个URL方案,它可以在内部以多种方式进行处理。
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]

一般回退规则不会将任何参数附加到default/front控制器。但是,由于这是一个内部重定向,您可以访问PHP中的REQUEST_URI来确定您应该做什么。
当然,这些不是你唯一的选择。只是我的2美分在汤里多搅拌一点。
免责声明:以上所有重写规则(当然还有其他所有规则)都是我直接写出来的(喝了几杯啤酒后),还没有在任何地方测试过。

oxf4rvwz

oxf4rvwz5#

大多数解决方案都依赖于mod_rewrite。例如,See here

相关问题