我想得到这个最终网址:
'理想网址'
domain/services/city/name/
来自此网址:
'真实网址'
domain/page.php?s=services&c=city&a=name
当用户输入“理想”网址和从按钮点击“真实”网址时,这应该都有效。
我希望这也适用domain/services/
作为domain/page.php?s=services
或domain/services/city/
作为domain/page.php?s=services&c=city
。
我不是在问代码,但实现这个结果的最佳做法是什么。
我是否应该只为每个案例使用htaccess和write命令,还是我必须做其他事情?
答案 0 :(得分:1)
最佳做法是编写查询解析器。请参阅示例TinyMVC框架,或serach google for router,front controller,dispatcher等。
可能很难实现,因为您有自定义参数名称,例如'c'和'a'。因此,您必须编写一些地图,将人类可读的参数名称分配给变量名称,如:
'city' => 'c'
'name' => 'a'
您的查询解析器还可以通过以下方式自动分配变量:
/domain/services/c=london/n=peter/
如果您将所有请求重新映射到.htaccess(通常为index.php)中的一个php文件,不包括图像,swf,css,js等,则此类调度程序可以与您的所有链接一起运行。
您决定如何规划您的网址路由逻辑。请记住特殊字符和网址编码。
考虑以数字顺序获取参数值,如“第一个参数”,“第二个参数”,以创建一个通用的url模式,如/ module / action / param1 / param2 /等。所以你总是可以通过数字获得一个参数,独立于它的名字。
您当然可以在htaccess中编写命令,但在添加新操作时会出现问题。
如果您想要提升这些“理想”网址,即使用户点击链接,提交表单等,您也不仅可以更改.htaccess或写入路由器。您还必须更改代码中的链接/操作或编写
之类的URL构建器 <a href="<?php buildUrl( 'modulke' , 'action' , 'param1' , 'param2' ); ?>">aaaa</a>
答案 1 :(得分:1)
通过httpd.conf
启用mod_rewrite和.htaccess,然后将此代码放在.htaccess
目录下的DOCUMENT_ROOT
中:
Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /
# redirects /page.php?s=services&c=city&a=name to /services/city/name/
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+page\.php\?s=([^&]+)&c=([^&]+)&a=([^&]+) [NC]
RewriteRule ^ /%1/%2/%3? [R=301,L]
# forwards /services/city/name/to /page.php?s=services&c=city&a=name
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ /page.php?s=$1&c=$2&a=$3 [L,QSA]
PS:请注意,上述规则只会处理/services/city/name/
URI。要处理/services/city/
和/services/
,您需要添加类似的规则集(每个URI有1个重定向和1个转发;从最具体到最通用)
答案 2 :(得分:0)
你可以在php端移动决策逻辑,某种调度程序。在htacess中,通过某种模式将任何不存在的URL重定向到某些/index.php?url=$bla或/rewrite.php?url=$bla
然后从那里加入你的代码。通过这种方式,大多数框架都能正常工作。
这里的主要问题是忽略100%的非PHP代码,如不存在的图像,CSS,javascripts等。
答案 3 :(得分:0)
你必须离开.htaccess
,这是要走的路。
对此的规则是:
RewriteEngine On
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^([^/.]+)/([^/.]+)/([^/.]*)?$ page.php?s=$1&c=$2&a=$3&%{QUERY_STRING}
</IfModule>
答案 4 :(得分:0)
http://www.addedbytes.com/articles/for-beginners/url-rewriting-for-beginners/拥有您正在寻找的所有答案。
正如@Uberfuzzy所说,最佳做法是首先定义最具体的:
RewriteRule ^domain/services/city domain/page.php?s=services&c=city [NC,L]
RewriteRule ^domain/services/ domain/page.php?s=services [NC,L]
您通常需要使用htaccess并为每种情况编写命令。例外情况是您使用框架(Zend Framewor)或其他工具来处理为您重写的URL。