php& .htaccess清理网址问题

时间:2011-07-09 13:26:43

标签: php .htaccess url

我想为我的网站使用干净的网址,但我有一个大问题! 我有网址:

index.php?lang=en&mod=product&section=category
index.php?lang=en&mod=product&caption=fetch&id=45
index.php?lang=pe&mod=blog&section=category&id=560
index.php?lang=pe&mod=blog&section=category&id=564
index.php?lang=pe&mod=blog&section=category&id=567
index.php?lang=pe&mod=blog&section=category&id=571
index.php?lang=pe&mod=blog&id=556
index.php?lang=pe&mod=page&id=537
index.php?lang=pe&mod=blog&id=558&o_t=cDate_ASC
index.php?lang=pe&mod=product&caption=fetch&id=7804

如你所见,我有一个问题,我的varibale的顺序是不同的,而我的第3或第4变量不稳定,有时它是id或有时是标题。 我想将我的模板URL设置为(例如en / product / category),但是当我想在.htaccess中设置它时,不清楚它们的深度是“id”还是“caption”!

我应该把所有变量放在我的网址中吗? :

index.php?lang=en&mod=product&section=category 

                  |
                  |
                  |
                  V

index.php?lang=en&mod=product&section=category&caption=&id=&o_t=&v_t=&offset=

编辑:

所以我使用smarty作为我的模板engine.i应该在我的清理网址(例如en / product / category / 324)模板中更改我的链接地址。我的问题是当我根据我的.htaccess重写规则设置en / product / 34或en / product / category / 23的链接时,不清楚第三部分是id还是category 在这种情况下:

RewriteRule ^/(en|pe)/(product|blog|page)/(category)/([0-9]{1,})/$ index.php?lang=$1&mod=$2&section=$3&id=$4 

第3个变量是类别.htaccess将第3部分定义为类别但是你可以看到有时url没有类别,而不是它有id! 我的大问题是

4 个答案:

答案 0 :(得分:1)

我认为你需要制定一些重写规则。

E.G。

RewriteRule ^/(en|pe)/(product|blog|page)/([0-9]{1,})/$ index.php?lang=$1&mod=$2&id=$3

将index.php?lang = en& mod = page& id = 22重写为/ en / page / 22(只要ID为> 1个字符)

RewriteRule ^/(en|pe)/(product|blog|page)/(category)/([0-9]{1,})/$ index.php?lang=$1&mod=$2&section=$3&id=$4

会将index.php?lang = en& mod = blog& section = category& id = 22重写为/ en / blog / category / 22

你可能需要在开始时使用^ /,这取决于你是否设置了RewriteBase。

编辑:

说明:

  • ^表示起始位置 来自基地的URL site.com/(无论这里是什么 URL)
  • (en|pe)首先表示 该特定规则中的值可以是 无论如何。添加更多很容易 (en | pe | ru | jp)等同样的 产品/博客/页面部分。包括我 (类别)只是因为你有其他 'section'类型不是 '类别'。
  • [0-9]是任意的 数字字符0到9. {1,}表示 长度为1+个字符。如果你想 2到4之间,做{2,4} 例。正好3个字符? {3}。 在针对特定目标时它很有用 的东西。

  • $表示匹配结束 串。如果你打算拥有 除了/之外没有任何内容 (甚至可以删除/)然后使用 那样的例子。如果你打算 拥有过去的博客标题 之后,你可以做(​​。*)$ which 意味着任何东西都可以在页面之后 id例如 / EN /博客/分类/ 22 / oheyoheyoheyohey 会是一样的 / EN /博客/分类/ 22 / abcjhrefgwgrjurgh。 如果您将标题作为参数传递 & title =这是标题,就是这样做 和我在例子中做的一样 除了使用[a-zA-Z0-9 - + _。]之外的ID 包括字母数字字符,+, - ,_,。

  • $1是。中的paranthesis参数的顺序 规则的第一个论点。例如。 $ 1 指(en | pe),所以lang也可以 be en or pe。



如果您希望规则应用于多个页面,而不仅仅是index.php,请将其设置为: RewriteRule ^ /([a-zA-Z])/(en | pe)/(product | blog | page)/([0-9] {1,})/ $ $ 1.php?lang = $ 2& mod = $ 3及ID = $ 4

因此,在这种情况下,site / blah / en / product / 22将与site.com/blah.php?lang=en&mod=product&id=22

相关

答案 1 :(得分:0)

你为什么要这样做?我发现您的网址没有任何问题,普通用户并不介意,那些坚持您网站的人可以毫无问题地阅读所有内容...

答案 2 :(得分:0)

您必须就参数的某些顺序达成一致,并使用多个重写规则。

对于订单lang> mod>部分>标题> id> o_t> v_t>抵消你想要这样的东西:

RewriteRule ^/(\w+)$ index.php?lang=$1
RewriteRule ^/(\w+)/(\w+)$ index.php?lang=$1&mod=$2
RewriteRule ^/(\w+)/(\w+)/(\w+)$ index.php?lang=$1&mod=$2&section=$3
RewriteRule ^/(\w+)/(\w+)/(\w+)/(\w+)$ index.php?lang=$1&mod=$2&section=$3&caption=$4
RewriteRule ^/(\w+)/(\w+)/(\w+)/(\w+)/(\d+)$ index.php?lang=$1&mod=$2&section=$3&caption=$4&id=$5
...
and so on

上面,我假设lang,mod,section和caption由字母字符组成(没有数字或特殊字符),id由数字组成。

答案 3 :(得分:0)

真实文件index.php不关心查询字符串中变量的顺序,或者是否缺少值,因为它接收了具有name-value的值:通过是否存在来确保正确的关联完整的夫妇。

要清楚,如果查询字符串是“?lang = en&amp; mode = blog ”或“?mode = blog&amp; lang = en <,则index.php是相同的/ em>“或者它只是”?lang = en “,因为变量是通过使用$ _GET关联数组在脚本内部管理的,独立于它们在数组中的顺序或存在。

重要的是,您要在新虚拟URL中计划正确的变量顺序以进行重写,因为它们仅包含变量内容,而变量名称则取自虚拟URL内的位置。那是(注意这是伪代码):

  yourdomain/val1/val2/val3/...etc 

要改写:

  index.php?var1=val1&var2=val2&var3=val3&...etc

因此,在您要计划的新网址中,不会缺少值。

您可以通过为缺少的变量分配假值来解决此问题,这些变量不会被脚本视为有效。

例如,如果缺少模式变量,则可以在该位置放置一个字符串,该字符串将被脚本视为无效,因此可以像处理它一样进行管理。

如果你有一个允许值数组,你可以添加一个控件* if(in_array())*而不是(或不是) if(empty())

当您构建指向其他页面的链接时,您只需为缺少的值添加此控件:    * if(empty(val3))val3 ='fake_value'; *