Я пытаюсь переписать мой режим, используя эту информацию [копия с веб-сайта], но она не работает .. что с этим не так, и 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-адрес
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 ^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-адрес скрыт от широкой публики и других пользователей вашего сайта.
Причина, по которой 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]