Понимание различий между переадресацией и переписыванием .htaccess

Я хотел бы понять разницу между перенаправлением и переписыванием URL-адреса с помощью .htaccess. Итак, вот пример: Скажем, у меня есть ссылка вроде www.abc.com/ index.php?page=product_types&cat=88 (назовите это "оригинальным" url)

Но когда пользователь вводит в abc.com/shoes (позвольте называть этот "желаемый" url), им нужно увидеть содержимое вышеуказанной ссылки. Для этого я бы сделал следующее:

Options +FollowSymLinks
RewriteEngine on
RewriteBase /
RewriteRule ^(.*)shoes(.*)$ index.php?page=product_types&cat=88

Ничего плохого в этом коде, и это трюк. Однако, если я набираю исходный url в адресной строке, содержимое появляется, но URL-адрес не изменяется. Таким образом, он остается www.abc.com/index.php?page=product_types&cat=88

Но что, если я хочу, чтобы желаемый url (/shoes) отображался в адресной строке, если я набрал www.abc.com/ index.php?page=product_types&cat=88? Как это сделать с использованием .htaccess? Я столкнулся с потенциальной петлей?

Ответы

Ответ 1

Некоторые объяснения можно найти здесь: fooobar.com/info/306528/...

Суть в том, что переписывание происходит исключительно на сервере, клиент (браузер) слеп. Браузер отправляет запрос и получает контент, неважно, что произошло на сервере, чтобы обслуживать запрос.

Перенаправление - это сервер ответ на запрос, который сообщает клиенту (браузеру), чтобы он отправил новый запрос. Браузер запрашивает URL-адрес, этот URL-адрес - это то, что в строке местоположения сервер получает этот запрос, а отвечает перенаправлением, браузер получает ответ и загружает URL-адрес в ответе сервера. URL-адрес в строке местоположения теперь представляет собой новый URL-адрес, и браузер отправляет запрос на новый URL-адрес.

Простое переписывание внутри сервера на сервере абсолютно ничего не делает для URL-адресов в дикой природе. Если google или reddit или какой-либо сайт имеет ссылку на www.abc.com/index.php?page=product_types&cat=88, ваше правило перезаписи внутреннего сервера абсолютно ничего не делает для этого, ни для тех, кто нажимает на эту ссылку, или на любого клиента, который случайно запрашивает этот URL-адрес по какой-либо причине. Все правило перезаписи - это внутреннее изменение чего-либо, содержащего shoes до /index.php?page=product_types&cat=88 внутри сервера.

Если вы хотите сделать так, чтобы запрос был сделан для страницы index.php со всеми строками запроса, вы можете сообщить клиенту (браузеру) ссылку перенаправить на более удобный URL. Вы должны быть осторожны, потому что переписываете цикл правил, и ваша переадресация будет внутренне переписана, что приведет к переадресации, которая будет внутренне переписана и т.д., Вызывая цикл и вызовет ошибку 500 Server. Таким образом, вы можете точно соответствовать самому запросу:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\?page=product_types&cat=88
RewriteRule ^/?index.php$ /shoes [L,R=301]

Это нужно использовать, чтобы сделать так, чтобы ссылки в дикой природе указывали на нужное место. Вы должны убедиться, что ваш контент генерирует правильные ссылки. Это означает, что все на вашем сайте использует ссылку /shoes вместо ссылки /index.php?page=product_types&cat=88.