我的HTACCESS上有一个frindly(不是很多但很适合我)的URL表达式。 该页面符合“模式”和ids
编辑类别:
#URL
edit.php?mode=cat&cat=1
#The expression
RewriteRule ^editar/([^/]*)/([^/]*)$ /edit.php?mode=$1&cat=$2 [NC,L]
#Output
/editar/cat/1
编辑子类别:
#URL
edit.php?mode=subcat&cat=1&subcat=1
#The expression
RewriteRule ^editar/([^/]*)/([^/]*)/([^/]*)$ /edit.php?mode=$1&cat=$2&subcat=$3 [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=$1&cat=$2&subcat=$3&prod=$4 [NC,L]
#Output
/editar/prod/1/1/1
到目前为止,非常好!
但我在同一页面上有三个表达式。
RewriteRule ^editar/([^/]*)/([^/]*)$ /edit.php?mode=$1&cat=$2 [NC,L]
RewriteRule ^editar/([^/]*)/([^/]*)/([^/]*)$ /edit.php?mode=$1&cat=$2&subcat=$3 [NC,L]
RewriteRule ^editar/([^/]*)/([^/]*)/([^/]*)/([^/]*)$ /edit.php?mode=$1&cat=$2&subcat=$3&prod=$4 [NC,L]
有没有办法将它减少到只有一个表达式,其中一些变量可能会或可能不存在于字符串中?
喜欢:edit.php?mode = prod& cat = 1 THIS - > & subcat = 1 AND THIS - > & prod = 1是可选的吗?
谢谢!
答案 0 :(得分:1)
试试这个:
RewriteEngine On
RewriteRule ^editar/([^/]+)/([^/]+)/?([^/]*)/?([^/]*)?$ - [E=PASS:mode=$1&cat=$2&subcat=$3&prod=$4]
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
注意:清除浏览器缓存测试。
答案 1 :(得分:0)
您可以在模式中选择第3和第4个捕获组。
RewriteRule ^editar/([^/]*)/([^/]*)/?([^/]*)/?([^/]*)/?$ /edit.php?mode=$1&cat=$2subcat=$3&prod=$4 [NC,L]
但是,如果uri为subcat
,那么您将获得空product
和/editar/foo/bar
值。