【发布时间】:2014-12-11 13:12:00
【问题描述】:
好旧的正则表达式快把我逼疯了。
我需要使用 Redirect from mod_alias(不能使用 mod_rewrite)将 Apache 2.4 中的所有流量从 HTTP 重定向到 HTTPS,“/bt/sub/[a_few_endings]”除外。
我在我认识的所有在线测试人员(例如http://regex101.com/)中测试了以下正则表达式,并且所有人都确认该正则表达式确实应该匹配除我不希望它匹配的 URL 之外的所有内容:
^/(?!bt/sub/(went_active|success|cancel|expired)).*$
据我所知,这应该匹配 http://local.mysite.com 中的 everything 并将其重定向到 https ://local.mysite.com,除了为以下四种:
- http://local.mysite.com/bt/sub/went_active
- http://local.mysite.com/bt/sub/success
- http://local.mysite.com/bt/sub/cancel
- http://local.mysite.com/bt/sub/expired
不过,Apache 会重定向所有内容,包括上述我不想重定向的 URL。
我在 SO 中发现了几个类似的问题,但大多数问题都是根据 mod_rewrite 来回答的,这不是我想要/需要的,而且人们说有用的那些对我没有用。
这是我目前的虚拟主机配置:
<VirtualHost *:80>
ServerName local.mysite.com
RedirectMatch 302 ^/(?!bt/sub/(went_active|success|cancel|expired)).*$ https://local.mysite.com
DocumentRoot /home/borfast/projects/www/mysite/public
#Header set Access-Control-Allow-Origin *
SetEnv LARAVEL_ENV localdev
<Directory /home/borfast/projects/www/mysite/public/>
Options All
DirectoryIndex index.php
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
请帮助并防止我发疯:)
更新: 发生了一些奇怪的事情:显然,当可以找到请求的 URL/路径时,Apache 会忽略 RedirectMatch 中的表达式并重定向客户端,即使 RedirectMatch 告诉它不要这样做。
为了测试这一点,我在一个单独的虚拟机中从头开始创建了一个新的虚拟主机,该虚拟机新安装了 Ubuntu Trussty 64,加载了 Apache 2.4。这个新的虚拟主机只包含 ServerName、RedirectMatch 和 DocumentRoot 指令,如下所示:
<VirtualHost *:80>
ServerName testing.com
RedirectMatch 302 ^/(?!bt/sub/(went_active|success)$).*$ https://othersite.com/
DocumentRoot /home/vagrant/www
</VirtualHost>
我创建了目录/home/vagrant/www/bt/sub/went_active 以确保 Apache 至少可以访问两个可能的 URL 之一。在尝试访问 http://testing.com:8080 时,我按预期被重定向。
然后奇怪的是:访问http://testing.com:8080/bt/sub/went_active时,与我创建的目录匹配的URL,我仍然被重定向,即使我不应该,但是当访问http://testing.com:8080/bt/sub/success时,我没有被重定向并且而是获得 403 Forbidden。
我可能对此失去了理智,但似乎当 Apache 发现它可以为请求提供服务并且它与 RedirectMatch 中应该阻止重定向的正则表达式匹配时,它决定忽略正则表达式并进行重定向.三个字母:WTF?!?!?!
【问题讨论】:
-
你的正则表达式匹配我的所有内容.*\.com\/foo\/bar\/(aaa|bbb|ccc|ddd) 我做了这个只匹配您不想替换的那些,如果您无法在代码中执行逻辑并需要它来匹配对立,只需将其设置为负前瞻或其他方式
-
无需转义
/ -
这会更容易使用
mod_rewrite... -
是的,但我明确表示我需要使用 mod_alias。如果人们不每年都买一部新手机,世界会更好,除此之外,还有很多事情是你无法改变的。 ;)
标签: regex apache redirect mod-alias apache2.4