我想为我的网站使用干净的网址,但我有一个大问题! 我有网址:
index.php?lang=en&mod=product§ion=category
index.php?lang=en&mod=product&caption=fetch&id=45
index.php?lang=pe&mod=blog§ion=category&id=560
index.php?lang=pe&mod=blog§ion=category&id=564
index.php?lang=pe&mod=blog§ion=category&id=567
index.php?lang=pe&mod=blog§ion=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§ion=category
|
|
|
V
index.php?lang=en&mod=product§ion=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§ion=$3&id=$4
第3个变量是类别.htaccess将第3部分定义为类别但是你可以看到有时url没有类别,而不是它有id! 我的大问题是
答案 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§ion=$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§ion=$3
RewriteRule ^/(\w+)/(\w+)/(\w+)/(\w+)$ index.php?lang=$1&mod=$2§ion=$3&caption=$4
RewriteRule ^/(\w+)/(\w+)/(\w+)/(\w+)/(\d+)$ index.php?lang=$1&mod=$2§ion=$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'; *