5

我想得到这个最终的网址:

'理想网址'

domain/services/city/name/

从这个网址:

'真实网址'

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

这在用户键入“理想”网址和从按钮单击“真实”网址时都应该有效。

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

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

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

4

5 回答 5

1

你必须使用.htaccessoff course,是要走的路。

一个规则是:

 RewriteEngine On

 <IfModule mod_rewrite.c>
      RewriteEngine On 
      RewriteRule ^([^/.]+)/([^/.]+)/([^/.]*)?$ page.php?s=$1&c=$2&a=$3&%{QUERY_STRING}
  </IfModule>
于 2013-03-28T14:13:38.483 回答
1

最佳实践是编写查询解析器。请参阅 TinyMVC 框架中的示例,或 serach google 中的路由器、前端控制器、调度程序等。

这可能很难实现,因为您有自定义参数名称,例如“c”和“a”。因此,您必须编写一些映射,将人类可读的参数名称分配给变量名称,例如:

'city' => 'c'
'name' => 'a'

您的查询解析器还可以通过某种方式自动分配变量,例如:

/domain/services/c=london/n=peter/

如果您将所有请求重新映射到 .htaccess 中的一个 php 文件(通常是 index.php),这种调度程序可以与您的所有链接一起运行,不包括图像、swf、css、js 等。

您将决定如何规划您的 url 路由逻辑。记住特殊字符和 url 编码。

考虑按数字顺序获取参数值,例如“第一个参数”、“第二个参数”,以创建通用 url 模式,例如 /module/action/param1/param2/ 等。因此,您始终可以通过数字获取参数,而与参数名称无关。

您当然可以在 htaccess 中编写命令,但是添加新操作时会出现问题。

如果即使用户单击链接、提交表单等,您也想提升那些“理想”的 url,您不能只更改 .htaccess 或编写路由器。您还必须更改代码中的链接/操作或编写 URL 构建器,例如

<a href="<?php buildUrl( 'modulke' , 'action' , 'param1' , 'param2' ); ?>">aaaa</a>

于 2013-03-28T14:13:21.677 回答
1

通过启用 mod_rewrite 和 .htaccess httpd.conf,然后将此代码放在您.htaccessDOCUMENT_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 个转发;从最具体到最通用)

于 2013-03-28T14:16:57.007 回答
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 Framewor)或其他为您处理 url 重写的工具时。

于 2013-03-28T14:21:33.847 回答
0

您可以移动决策逻辑,某种在 php 端的调度程序上。在 htacess 中,通过某种模式将任何不存在的 url 重定向到某些 /index.php?url=$bla 或 /rewrite.php?url=$bla

然后从那里包含您的代码。大多数框架都以这种方式工作。

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

于 2013-03-28T14:12:54.830 回答