Модем переписывается с использованием .htaccess

Я пытаюсь переписать мой режим, используя эту информацию [копия с веб-сайта], но она не работает .. что с этим не так, и PLZ дать правильный ответ.

Механизм перезаписи Apache в основном используется для превращения динамического URL-адреса, такого как www.yoursite.com/product.php?id=123, в статический и удобный URL-адрес, например, www.yoursite.com/product/123

RewriteEngine on RewriteRule ^product/([^/.]+)/?$ product.php?id=$1 [L] 

Другой пример: переписать:

www.yoursite.com/script.php?product=123 – www.yoursite.com/cat/product/123/

 RewriteRule cat/(.*)/(.*)/$ /script.php?$1=$2 

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

Совсем просто, когда вы просматриваете:

  localhost/abc/product.php?id=23 

RewriteRule не вызывается и ничего не должен делать. Здесь нет ничего плохого, вы просто просматриваете неправильный URL-адрес

Преобразование URL

 http://www.yoursite.com/product/123 <- URL that user goes to http://www.yoursite.com/product.php?id=123 <- Rewritten URL that the server sees 

RewriteRule (ы) объяснены

Правило перезаписи разбивается на три части (не включая часть RewriteRule …)

  1. Регулярное выражение, совпадающее с URL-адресом
  2. URL-адрес, который он преобразует в
  3. Дополнительные опции

Учитывая ваше правило:

 RewriteRule ^product/([^/.]+)/?$ product.php?id=$1 [L] 

^product/([^/.]+)/?$ выражение: ^product/([^/.]+)/?$
Новый url: product.php?id=$1
Опции: [L]

Это означает, что пользователь просматривает хороший URL-адрес http://www.yoursite.com/product/123 (и все ваши ссылки указывают на хорошие URL-адреса), а затем сервер сопоставляется с регулярным выражением и преобразует его в новый URL-адрес что видит только сервер .

Эффективно это означает, что у вас есть два URL-адреса, указывающие на одну и ту же страницу … Хороший URL-адрес и не-хороший URL, оба из которых перенесут вас на одно и то же место. Разница заключается в том, что нечетный / стандартный URL-адрес скрыт от широкой публики и других пользователей вашего сайта.


Regex

Причина, по которой http://mysite.com/product/image.jpg не перенаправляется, связана с регулярным выражением, которое вы используете в RewriteRule .

объяснение

 ^product/([^/.]+)/?$ 
  • ^ => Начало строки
  • product/ => Соответствует строковой строке product/
  • ([^/.]+) => Группа захвата, соответствующая одному или нескольким символам, до следующего / или .
  • /?$ => Соответствует необязательному / следующему концу строки

Учитывая URL-адрес:

 http://mysite.com/product/image.jpg 

Ваше регулярное выражение совпадает с product/image но затем оно встречается . который останавливает совпадение … Поскольку это не конец строки $ правило недействительно, и поэтому преобразование никогда не происходит.

Вы можете исправить это, изменив свой класс символов [^/.] просто [^/] или – мой предпочтительный метод – удалить класс символов и просто использовать .+ (Видя, что вы все-таки захватываете все до конца строки

 RewriteRule ^product/([^/]+)/?$ product.php?id=$1 [L] RewriteRule ^product/(.+)/?$ product.php?id=$1 [L] 

Пытаться

 RewriteRule ^product/([a-zA-Z0-9_]+)/?$ product.php?id=$1 [L]