繁体   English   中英

php & .htaccess 清洁 url 问题

[英]php & .htaccess clean url problem

我想为我的网站使用干净的 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

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

我应该像这样将所有变量放在我的 url 中吗?

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 作为我的模板引擎。我应该在模板中更改我的链接地址,比如我的干净 url(例如 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 

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

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

例如

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 的起始 position 即 site.com/(此处为 URL)
  • (en|pe)表示该特定规则中的第一个值可以是 en 或 pe。 添加更多内容很容易 (en|pe|ru|jp) 等。产品/博客/页面部分也是如此。 我包括(类别),以防您有其他不是“类别”的“部分”类型。
  • [0-9]是 0 到 9 之间的任意数字字符。{1,} 表示长度为 1+ 个字符。 如果您想要介于 2 和 4 之间,请执行 {2,4} 例如。 正好3个字? {3}。 在针对特定事物时很有用。

  • $表示匹配字符串的结尾。 如果您打算在 id 之后除了 / 之外什么都没有(甚至可以删除该 /),然后按原样使用该示例。 如果你打算在以后有一个博客的标题,你可以做 (.*)$ 这意味着任何东西都可以在页面 id 之后,例如 /en/blog/category/22/oheyoheyoheyohey 将与 /en/blog 相同/category/22/abcjhrefgwgrjurgh. 如果您将标题作为参数传递 &title=this 是标题,只需执行与我在 ID 示例中所做的相同的操作,除了使用 [a-zA-Z0-9-+_.] 包含字母数字字符、+、 -,_,。

  • $1是规则第一个参数中的括号 arguments 的顺序。 EG $1 指的是 (en|pe),所以 lang 可以是 en 或 pe。



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

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

为什么要这样做? 我认为您的网址没有问题,普通用户不介意,那些检查您的网站的人可以毫无问题地阅读所有内容......

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

对于 lang > mod > section > caption > id > o_t > v_t > offset 的顺序,你想要这样的东西:

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 由数字组成。

真正的文件 index.php 不关心查询字符串中变量的顺序,或者是否缺少值,因为它接收带有名称-值的耦合:正确的关联是由完整耦合的存在或不存在来确保的。

需要明确的是,对于 index.php,如果查询字符串是“ ?lang=en&mode=blog ”或“ ?mode=blog&lang=en ”或者只有“ ?lang=en ”,则它是相同的,因为变量是托管的通过使用 $_GET 关联数组在脚本内部,独立于它们在数组中的顺序或存在。

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

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

改写为:

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

因此,在您要计划的新 URL 中,不能有缺失值。

您可以通过将假值分配给脚本不会将其视为有效的缺失变量来解决此问题。

例如,如果缺少模式变量,您可以在 position 中放入一个脚本不会认为有效的字符串,因此可以将其视为空的一样进行管理。

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

当你建立到其他页面的链接时,你可以为缺失值添加这个控件: *if (empty(val3)) val3 = 'fake_value';*

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM