Regex Apache重写规则-正则表达式帮助

Regex Apache重写规则-正则表达式帮助,regex,apache,mod-rewrite,url-rewriting,Regex,Apache,Mod Rewrite,Url Rewriting,我有7个网址: url: /v/3b89441db7986135e5eb9e1debf0cc23 url: /v/3b89441db7986135e5eb9e1debf0cc23/login url: /v/3b89441db7986135e5eb9e1debf0cc23/logout url: /v/3b89441db7986135e5eb9e1debf0cc23/access url: /v/3b89441db7986135e5eb9e1debf0cc23/delete-attendee/:

我有7个网址:

url: /v/3b89441db7986135e5eb9e1debf0cc23
url: /v/3b89441db7986135e5eb9e1debf0cc23/login
url: /v/3b89441db7986135e5eb9e1debf0cc23/logout
url: /v/3b89441db7986135e5eb9e1debf0cc23/access
url: /v/3b89441db7986135e5eb9e1debf0cc23/delete-attendee/:id
url: /v/3b89441db7986135e5eb9e1debf0cc23/edit-attendee/:id
url: /v/3b89441db7986135e5eb9e1debf0cc23/finalise
如果这些URL不匹配,我如何编写重写规则,将用户重定向到另一个域

例如,/v/之后的部分始终是32个字符的MD5字符串。id部分始终是一个数字

如果你能给我一个正则表达式(正则表达式从来不是我的强项)的例子

/v/3b89441db7986135e5eb9e1debf0cc23


那太好了。

此正则表达式与您的URL匹配:

/v/[a-f0-9]{32}(/[a-z-]+(/\d+)?)?
用英语

  • /v/
    是一个文本
  • [a-f0-9]{32}
    表示32位十六进制数字
  • /[a-z-]+(/\d+)?表示“/”然后至少是(任何小写字母或破折号)中的一个,然后是“/”然后是一些数字
  • (…)?
    中包围一个正则表达式意味着其中一个或没有一个
仅供参考,此正则表达式与所有有问题的URL匹配得相当紧密

如果要不匹配,请使用以下选项:

^(?!/v/[a-f0-9]{32}(/[a-z-]+(/\d+)?)?$)
这个怎么样:

\/v\/[a-f0-9]{32}(\/(登录|注销|访问|删除与会者\/:\d+|编辑与会者\/:\d+|定稿)


这将仅与您接受的URL匹配。您应该根据您的风格或正则表达式以及相应的转义字符进行调整。

您说过如果URL不匹配,您希望重定向,因此首先您必须制定一个与所有有效URL匹配的规则,然后添加前缀
,以取消匹配

RewriteEngine On
RewriteRule !^v/[0-9a-f]{32}(/(login|logout|access|delete-attendee/\d+|edit-attendee/\d+|finalise))?$ http://your-other-domain/ [R]

上述规则应放在您网站根目录中的
.htaccess
文件中。

Hm,我猜Bohemian给出了一个正则表达式,与后两个请求的字符串相匹配。如果字符串不同,原始海报希望通过重写规则重定向访问者不是请求的解决方案的一部分。这部分将l由原始海报自己解决;-)但
{32}
部分匹配32个字符,请求将其限制为md5(小写),即波希米亚人回答中给出的
[a-f0-9]{32}
。我的错误是,我在发布之前没有检查md5的格式。我已经修改过了。嘿@salman,谢谢你的帮助。我删除了\:但是它会重定向给它的每个URL…@Jamie:即使删除了
\:
,它似乎也能在我的系统上工作(请参阅修订的答案)。它似乎重定向了所有与您提到的7种url模式不匹配的url。如果要相反,请删除前导的
。在模式(
!^/v/…
)中添加一个前导的
/
,在某些Apache配置中可能会有所帮助。
RewriteEngine On
RewriteRule !^v/[0-9a-f]{32}(/(login|logout|access|delete-attendee/\d+|edit-attendee/\d+|finalise))?$ http://your-other-domain/ [R]