Intereting Posts
функция возвращает только первое значение массива с результатом запроса mysqli Захват прогресса из командной строки Как проверить, если пользователь выбрал файл для загрузки? Как сгенерировать все перестановки строки в PHP? как разбить один столбец с огромными текстовыми данными на несколько столбцов или массивов в sql и php Как перенаправить на другой URL-адрес на основе ролей в symfony 2 Mysql, PDO – как инструкция не работает с помощью bindParam PHP получатель формы отправки электронной почты не получает правильный адрес электронной почты sendr Что делает session_register_shutdown? Как перенаправить пользователей на основе языка браузера Алгоритм MySQL / PHP для расчета количества дней недели / недели (в месяц) Обновление Laravel Eloquent только в случае внесения изменений Как найти физическую длину строки? Laravel – проверьте, не пусто ли Один длинный класс или несколько более коротких классов?

Как я могу отображать дружественные URL-адреса с помощью mod_rewrite?

Я не разработчик PHP в глубине души, и меня попросили выполнить некоторые SEO на существующем веб-сайте PHP.

Первое, что я заметил, это уродливые URL-адреса, поэтому я хочу, чтобы они переписывались в нечто более информативное. Вот все возможные шаблоны:

/index.php?m=ModuleType&categoryID=id /index.php?m=ModuleType&categoryID=id&productID=id /index.php?page=PageType /index.php?page=PageType&detail=yes 

Таким образом, в основном я хочу сделать это:

 /ModuleType/Category /ModuleType/Category/ProductName /Page /Page 

Я не использовал mod_rewrite, прежде чем какие-либо советы или примеры были бы замечательными!

Благодарю.

mod_rewrite скорее использовался бы для противоположного: переписывать запросы /ModuleType/Category/ProductName внутренне в /index.php?m=ModuleType&categoryID=id&productID=id . Использование новых URL-адресов в документах – это работа вашего приложения.


Редактировать Вот пример того, как выглядит функция, которая превращает ваши параметризованные URL в новые:

 function url($url, $rules) { $url = parse_url($url); parse_str($url['query'], $url['query']); $argNames = array_keys($url['query']); foreach ($rules as $rule) { if ($rule[0] == $url['path'] && array_keys($rule[1]) == $argNames) { $newUrl = $rule[2]; foreach ($rule[1] as $name => $pattern) { if (!preg_match('/'.addcslashes($pattern, '/').'/', $url['query'][$name], $match)) { continue 2; } $newUrl = str_replace('<'.$name.'>', $match[0], $newUrl); } return $newUrl; } } return $url; } $rules = array( array( '/index.php', array('m'=>'.*', 'categoryID'=>'.*', 'productID'=>'.*'), '/<m>/<categoryID>/<productID>' ) ); echo '<a href="' . url('/index.php?m=ModuleType&categoryID=categoryID&productID=productID', $rules) . '">/ModuleType/Category/ProductName</a>'; 

Я не эксперт mod_rewrite, но это пример того, как я собрал .htaccess для сайта Image Flair:

 <IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^(.*)/(.*)\.png$ imageFlair.php?mode=$1&userid=$2 [L] RewriteRule ^(.*)\.png$ imageFlair.php?userid=$1 [L] </IfModule> 

Это в основном карты:

MODE / USERID.png -> imageFlair.php? Mode = MODE & userid = USERID

а также

USERID.png -> imageFlair.php? Userid = USERID

Вы должны уметь адаптировать это к вашим потребностям, но у вас может быть несколько проблем:

  1. Если вы хотите использовать «имена», а не идентификаторы на вашем URL-адресе, вам нужно будет изменить PHP, чтобы принять имена.
  2. Возможно, у вас возникла проблема с конфликтом / Страница и / ModuleType, если вы хотите также включить в параметр дополнительные параметры с помощью страницы, если вы не можете собрать регулярное выражение, которое может определить, что есть.

Переходя к списку URL-адресов, которые вы хотите, это должно работать, хотя я не буду утверждать, что это лучший или единственный способ сделать это 🙂

 <IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^(.*)/(.*)/(.*)$ index.php?m=$1&categoryID=$2&productID=$3 [L] RewriteRule ^(.*)/(.*)$ index.php?m=$1&categoryID=$2 [L] RewriteRule ^(.*)$ index.php?Page=$1 [L] </IfModule> 

Как и было предложено, вы можете захотеть заменить. * На [^ /] +, но у меня были проблемы с несоответствиями, когда я это делал, и не было времени для устранения неполадок, поэтому YMMV 🙂

С вашего поста не совсем понятно, что такое переменные. Но если предположить, что ModuleType , id (x2) и Page являются всеми переменными, тогда следующие правила с ModuleType должны работать в файле .htaccess .

 RewriteEngine On RewriteRule ^([^/]+)/([^/]+)$ /index.php?m=$1&categoryID=$2 [L] RewriteRule ^([^/]+)/([^/]+)/([^/]+)$ /index.php?m=$1&categoryID=$2&productID=$3 [L] RewriteRule ^([^/]+)$ /index.php?page=PageType [L] RewriteRule ^([^/]+)/detail$ /index.php?page=PageType&detail=yes [L] 

Последнее не имело смысла, поскольку вы его написали. Поэтому вместо этого вы можете добавить /detail в конце.

Они должны проскальзывать прямо поверх существующих приложений без каких-либо изменений в приложении. Поскольку они не перенаправляются с помощью [R] они будут прозрачными для ваших пользователей.