htaccess最佳实践

时间:2013-03-28 13:59:43

标签: php mod-rewrite

我想得到这个最终网址:

'理想网址'

domain/services/city/name/

来自此网址:

'真实网址'

domain/page.php?s=services&c=city&a=name

当用户输入“理想”网址和从按钮点击“真实”网址时,这应该都有效。

我希望这也适用domain/services/作为domain/page.php?s=servicesdomain/services/city/作为domain/page.php?s=services&c=city

我不是在问代码,但实现这个结果的最佳做法是什么。

我是否应该只为每个案例使用htaccess和write命令,还是我必须做其他事情?

5 个答案:

答案 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。