使用 mod_rewrite 重写用户代理规则

Posted

技术标签:

【中文标题】使用 mod_rewrite 重写用户代理规则【英文标题】:Rewrite rule for user agent with mod_rewrite 【发布时间】:2011-06-05 09:42:07 【问题描述】:

我正在尝试将所有请求从特定用户代理重定向到域的子域。我的规则如下:

RewriteEngine  on
RewriteCond %HTTP_USER_AGENT  ^Test Agent/(.*)$ // <-- Line 4
RewriteRule ^(.*)$         https://test.domain.com/$1          [L,302]

但我在启动网络服务器时得到的只是:

Syntax error on line 4 of /var/www/misafe/internal/misafe-old.conf:
RewriteCond: bad flag delimiters

对我来说看起来不错,但我显然遗漏了一些东西,而且这个错误没有多大帮助。有什么想法吗?

谢谢, J

【问题讨论】:

【参考方案1】:

有 2 个错误:

第一:

RewriteCond %HTTP_USER_AGENT  ^Test Agent/(.*)$

您需要在正则表达式模式中转义空格和正斜杠。

RewriteCond %HTTP_USER_AGENT  ^Test\ Agent\/(.*)$

第二:

RewriteRule ^(.*)$         https://test.domain.com/$1          [L,302]

302 是一个重定向 HTTP 状态代码,但您没有指定您正在重定向。

RewriteRule ^(.*)$         https://test.domain.com/$1          [L,R=302]

【讨论】:

完美,就是这样!无论我尝试多少,我似乎永远无法正确使用正则表达式,这对我来说似乎很陌生。无论如何,规则现在运行良好。谢谢。 要明确,问题不是任何正则表达式转义,而是配置文件语法转义。表达式中的空格完全可以不用转义,但如果有(或可能有)空格,则应在配置文件中使用引号。【参考方案2】:

线路:RewriteRule ^(.*)$ @987654321@$1 [L,302]

应该是:RewriteRule ^(.*)$ @987654322@$1 [R=302]

【讨论】:

感谢您的回复,这绝对是问题的一部分,我没有正确逃脱正则表达式的事实是另一个问题。

以上是关于使用 mod_rewrite 重写用户代理规则的主要内容,如果未能解决你的问题,请参考以下文章

Apache 2.4 不使用适用于 2.2 的规则通过 mod_rewrite 进行代理

mod_rewrite:重写规则还是重定向?

mod_rewrite 到 nginx 重写规则

apache mod_rewrite - 重写规则

Apache的Mod_rewrite学习(RewriteRule重写规则的语法) 转

apache mod_rewrite:如何根据其他目录中的文件存在为同一目录添加不同的重写规则?