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
,您将得到空的 subcat
和 product
值。
试试这个:
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
注意:清除浏览器缓存然后测试。
我的 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
,您将得到空的 subcat
和 product
值。
试试这个:
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
注意:清除浏览器缓存然后测试。