Friendly URL 可能包含或不包含参数

Friendly URL may contain or not parameter

我的 HTACCESS 上有一个友好的(不是很多,但很适合我)URL 表达。 页面对应 "mode" 和 ids

编辑类别:

#URL
    edit.php?mode=cat&cat=1
#The expression
    RewriteRule ^editar/([^/]*)/([^/]*)$ /edit.php?mode=&cat= [NC,L]
#Output
    /editar/cat/1

编辑子类别:

#URL
    edit.php?mode=subcat&cat=1&subcat=1
#The expression
    RewriteRule ^editar/([^/]*)/([^/]*)/([^/]*)$ /edit.php?mode=&cat=&subcat= [NC,L]
#Output
    /editar/subcat/1/1

编辑产品:

#URL
    edit.php?mode=prod&cat=1&subcat=1&prod=1
#The expression
    RewriteRule ^editar/([^/]*)/([^/]*)/([^/]*)/([^/]*)$ /edit.php?mode=&cat=&subcat=&prod= [NC,L]
#Output
    /editar/prod/1/1/1

到目前为止,一切顺利!

但是同一个页面我有三个表达式。

RewriteRule ^editar/([^/]*)/([^/]*)$ /edit.php?mode=&cat= [NC,L]
RewriteRule ^editar/([^/]*)/([^/]*)/([^/]*)$ /edit.php?mode=&cat=&subcat= [NC,L]
RewriteRule ^editar/([^/]*)/([^/]*)/([^/]*)/([^/]*)$ /edit.php?mode=&cat=&subcat=&prod= [NC,L]

有没有办法将其减少到只有一个表达式,其中字符串中可能存在或可能不存在某些变量?

喜欢:edit.php?mode=prod&cat=1 这个 -> &subcat=1 和这个 -> &prod=1 是可选的?

谢谢!

您可以在您的模式中将第 3 和第 4 个 capture-groups 设为可选。

RewriteRule ^editar/([^/]*)/([^/]*)/?([^/]*)/?([^/]*)/?$ /edit.php?mode=&cat=subcat=&prod= [NC,L]

但是这样做,如果 uri 是 /editar/foo/bar,您将得到空的 subcatproduct 值。

试试这个:

RewriteEngine On
RewriteRule ^editar/([^/]+)/([^/]+)/?([^/]*)/?([^/]*)?$  - [E=PASS:mode=&cat=&subcat=&prod=]
RewriteCond %{ENV:PASS} ^((mode=(.*))&subcat=&prod=|(mode=(.*)&subcat=(.+))&prod=|(mode=(.*)&subcat=(.+)&prod=(.+)))$
RewriteRule ^    /edit.php?%2%4%7 [L,NE]

因此,使用上面的代码,您将能够处理如下请求:

/editar/1 or editar/1/     = not match
/editar/1/2 or editar/1/2/   = match and redirect to /edit.php?mode=1&cat=2
/editar/1/2/3 or editar/1/2/3/   = match and redirect to /edit.php?mode=1&cat=2&subcat=3
/editar/1/2/3/4  = match and redirect to /edit.php?mode=1&cat=2&subcat=3&prod=4
/editar/1/2/3/4/    = not match

注意:清除浏览器缓存然后测试。