htaccess最佳实践

5
我希望能够获得最终的URL地址:

'理想的URL地址'

domain/services/city/name/

从这个网址获取:

'真实的网址'

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

当用户输入“理想”的URL或从按钮中点击“真实”URL时,都应该有效。

我希望这也适用于domain/services/,即将其作为domain/page.php?s=servicesdomain/services/city/,即将其作为domain/page.php?s=services&c=city处理。

我并不是在请求代码,而是要了解如何最好地实现此结果。

我应该只使用htaccess并为每种情况编写命令,还是需要做其他事情?


我多年来一直使用的一句话是,在编写重写规则时,就像CSS一样,首先匹配最具体(最长)的。这可能不是最“正确”的方法,但它为我服务得很好。 - Uberfuzzy
我很惊讶这个问题没有被标记为“基于观点”,但我认为“最佳实践”答案仍然很有价值。 - SteveExdia
5个回答

1
最佳实践是编写一个查询解析器。例如在TinyMVC框架中可以看到示例,或者搜索Google了解路由器、前端控制器、调度程序等内容。
这可能很难实现,因为您具有自定义参数名称,例如'c'和'a'。因此,您必须编写一些映射,将可读的参数名称分配给变量名称,例如:
'city' => 'c'
'name' => 'a'

您的查询解析器也可以像这样自动分配变量:
/domain/services/c=london/n=peter/

这种调度程序可以在.htaccess(通常为index.php)中将所有请求重定向到一个php文件上运行,但要排除图像、swf、css、js等文件。
你需要决定如何规划URL路由逻辑,记得考虑特殊字符和URL编码。
建议按数字顺序获取参数值,例如“第一个参数”、“第二个参数”,以创建通用的URL模式,如/module/action/param1/param2/等。这样,您可以始终通过数字获取参数,而不受其名称的影响。
当添加新操作时,在htaccess中编写命令可能会有问题。
如果您想在用户单击链接、提交表单等时也使用这些“理想”的URL,则不能仅更改.htaccess或编写路由器。您还必须更改代码中的链接/操作或编写URL构建器,如: aaaa

1

当然,你需要使用.htaccess,这是解决问题的方法。

实现这个的规则如下:

 RewriteEngine On

 <IfModule mod_rewrite.c>
      RewriteEngine On 
      RewriteRule ^([^/.]+)/([^/.]+)/([^/.]*)?$ page.php?s=$1&c=$2&a=$3&%{QUERY_STRING}
  </IfModule>

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]

提示:请注意,上述规则仅适用于/services/city/name/ URI。要处理/services/city//services/,您需要添加类似的一组规则(每个URI需要1个重定向和1个转发;从最具体到最通用)。


1

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 Framework)或其他工具来处理URL重写时。


0

你可以将决策逻辑,某种调度程序放在php端。在htaccess中,将任何不存在的url按照某种模式重定向到某个/index.php?url=$bla或/rewrite.php?url=$bla

然后从那里包含你的代码。这样大多数框架都能工作。

这里的主要问题是忽略100%的非php代码,比如不存在的图片、CSS、javascript等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接