если запрос 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: // [OR] 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, он перешел в цикл перенаправления
Попробуйте следующее:
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 (потенциальный цикл перенаправления) обратно к пользовательскому агенту, который уже создал этот искаженный запрос. Тот же самый пользовательский агент, скорее всего, создаст такой же искаженный запрос (?), Если даже произойдет перенаправление (потому что URL-путь фактически не изменился).
Я думаю, вам лучше отклонять такие искаженные запросы в конфигурации вашего сервера, поскольку я все равно не могу представить, что это законные запросы? Например:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ https?://[^\ ]+ HTTP/ [NC]
RewriteRule ^ - [F]
Хотя могут быть способы получше, чем использование mod_rewrite.
Мог бы решить это с помощью
RewriteEngine On
RewriteCond %{THE_REQUEST} http:// [NC]
RewriteRule ^(.*)$ %{REQUEST_URI} [R=301,L]
RewriteCond %{THE_REQUEST} https:// [NC]
RewriteRule ^(.*)$ %{REQUEST_URI} [R=301,L]