htaccess 请求 uri 以 http(s) 重定向开头

htaccess 请求 uri 以 http(s) 重定向开头

如果请求 uri = / 我想让请求

GET / HTTP/1.1\r\n
Host: www.example.com\r\n
Accept: */*\r\n
Content-Type: text/html\r\n
Proxy-Connection: Keep-Alive\r\n
Content-length: 0\r\n
\r\n

但如果请求 uri 以 http:// [或] https:// 开头

GET http://www.baidu.com/ HTTP/1.1\r\n
Host: www.baidu.com\r\n
Accept: */*\r\n
Content-Type: text/html\r\n
Proxy-Connection: Keep-Alive\r\n
Content-length: 0\r\n
\r\n

我希望它 301 重定向到请求的 uri(在此示例中重定向到 www.baidu.com)

我已经在我的 .htaccess 中尝试过这个

RewriteEngine On
RewriteCond %{REQUEST_URI} ^http://$
RewriteRule ^(.*)$ %{REQUEST_URI} [R=301,L]
RewriteCond %{REQUEST_URI} ^https://$
RewriteRule ^(.*)$ %{REQUEST_URI} [R=301,L]

但当我尝试访问 www.example.com 时,它进入了重定向循环

答案1

请尝试以下操作:

RewriteEngine On
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ https?://[^\ ]+ HTTP/ [NC]
RewriteRule ^ %{REQUEST_URI} [R=301,L]

其中THE_REQUEST服务器变量是初始请求标头。例如:

GET http://www.baidu.com/ HTTP/1.1

然而,我怀疑这是否可行——或者这是否可能。你实际上是在重定向到相同的网址(潜在的重定向循环),返回到已经构造此格式错误的请求的用户代理。如果重定向发生(因为 URL 路径实际上没有改变),则同一个用户代理很可能会构造相同的格式错误的请求(?)。

我认为你最好在服务器配置中拒绝这种格式错误的请求,因为我无论如何都无法想象它们是合法的请求?例如:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ https?://[^\ ]+ HTTP/ [NC]
RewriteRule ^ - [F]

尽管可能有比使用 mod_rewrite 更好的方法。

答案2

可能已经解决了这个问题

RewriteEngine On
RewriteCond %{THE_REQUEST} http:// [NC]
RewriteRule ^(.*)$ %{REQUEST_URI} [R=301,L]
RewriteCond %{THE_REQUEST} https:// [NC]
RewriteRule ^(.*)$ %{REQUEST_URI} [R=301,L]

相关内容