mod_rewrite

Мой текущий код что-то вроде этого

store.php?storeid=12&page=3 

и я хочу перевести его на что-то вроде этого

 mysite.com/roberts-clothing-store/store/12/3 

и что-то вроде этого:

 profile.php?userid=19 

в

 mysite.com/robert-ashcroft/user/19 

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

 mysite.com/user/19/robert-ashcroft 

(что делает stackoverflow)

Я не могу понять, как это сделать в mod_rewrite от apache. Любая помощь?

На самом деле вам, возможно, придется подумать «вверх тормашками» с mod_rewrite .

Самый простой способ – заставить ваш PHP mysite.com/roberts-clothing-store/store/12/3 переписанные ссылки mysite.com/roberts-clothing-store/store/12/3 .

mod_rewrite затем проксирует запрос на одну страницу PHP для rewrite.php?path=roberts-clothing-store/store/12/3 storeid , которая расшифровывает URL-адрес и устанавливает аргументы (здесь storeid и page ) и динамически включает правильный файл PHP , или просто исправить 301 для переименованных страниц.

Чистое решение с mod_rewrite возможно, но это намного легче получить, особенно если вы не mod_rewrite .

Основная проблема может заключаться в накладных расходах, которые могут быть значительными, но это цена простоты и гибкости. mod_rewrite намного быстрее

Обновить :

Другие сообщения отвечают на вопрос, но они не решают типичную проблему с дублированием контента, которую избегают с помощью канонических URL-адресов (и используя 301/404 для всех этих URL-адресов, которые выглядят нормально, но не являются).

Попробуйте следующие правила:

 RewriteRule ^[^/]+/store/([0-9]+)/([0-9]+)$ store.php?storeid=$1&page=$2 RewriteRule ^[^/]+/user/([0-9]+)/ profile.php?userid=$1 

Но я бы не использовал такие URL-адреса. Они не имеют смысла, когда вы рассматриваете путь URL как иерархию и сегменты пути как свои уровни.

Тогда вы можете просто использовать директиву RewriteRule в .htacces, например:

 RewriteRule roberts-clothing-store/store/(\d+)/(\d+)$ store.php?storeid=$1&page=$2 [L] 

См. http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html для справки или google.

 RewriteRule ^roberts-clothing-store/store/([^.]+)/([^.]+)$ store.php?id=$1&page=$2 RewriteRule ^robert-ashcroft/user/([^.]+)$ profile.php?userid=$1 

Мой подход состоит в том, чтобы сделать .htaccess как можно проще и сделать всю тяжелую работу в PHP:

 RewriteRule ^(.*?)$ index.php?$1 

Это в основном означает взять все и перенаправить его в файл index.php (в каталогах css / javascript / image я просто использую «RewriteEngine off» для доступа к этим файлам). В PHP я просто разделил («/», $ param, 5) строку и запустил foreach (), чтобы проверить все параметры. Инкапсулированный в хорошую функцию, это отлично работает для меня.

Обновить:

В этом простом случае я настоятельно рекомендую использовать explode () вместо использования split (), потому что explode () не приходит с накладными расходами, используя регулярные выражения.