.htaccess 重写规则取决于HTTP_REFERER和REMOTE_ADDR

6uxekuva  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(148)

我需要将用户重定向到一个特定的页面,如果他们不是来自一个特定的IP,如果他们正在请求一个特定的域。
我试探着:

RewriteEngine On
RewriteCond %{HTTP_REFERER} ^hello\.example\.com [NC] # the user requested https://hello.example.com
RewriteCond %{REMOTE_ADDR} !^123\.456\.789\.99 # the user's IP is not 123.456.789.99
RewriteCond %{REQUEST_URI} !/maintenance.html$ [NC] # the user is not already on the redirected page
RewriteRule .* /maintenance.html [R=302,L]

但它不工作...
帮忙?

tct7dpnv

tct7dpnv1#

HTTP_REFERER包含 * refering * URL(Referer HTTP请求头的内容,即用户 * 来自 * 的URL),而不是被请求的域。为此,您需要测试HTTP_HOST服务器变量(即Host HTTP请求头)。
另请注意,Apache不支持行尾注解-您的第二个 condition(如所写)将由于无效的标志参数而导致500 Internal Server Error。
不需要检查所请求的URL不是/maintenance.html的第三个条件,因为这可以在RewriteRule本身中更有效地检查。
请尝试以下方法:

RewriteCond %{HTTP_HOST} ^hello\.example\.com [NC]
RewriteCond %{REMOTE_ADDR} !^123\.456\.789\.99$
RewriteRule !maintenance\.html$ /maintenance.html [NC,R=302,L]

请注意,与RewriteRule * 模式 * 匹配的URL路径不以斜杠开头。

  • 旁白:* 对于检查单个IP地址,使用字典字符串比较(使用=前缀运算符)通常比使用正则表达式更容易/更简洁。例如:
:
RewriteCond %{REMOTE_ADDR} !=123.456.789.99
:

但是,如果您正在实施临时的“维护中”页面,则应考虑发送“503服务不可用”响应。
参考编号:

相关问题