如果请求 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]