mod_rewrite - PullRequest
       14

mod_rewrite

4 голосов
/ 21 июня 2009

Мой текущий код выглядит примерно так

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. Любая помощь?

Ответы [ 5 ]

4 голосов
/ 21 июня 2009

На самом деле, вам, возможно, придется думать "вверх ногами" с mod_rewrite.

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

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

Возможно чистое решение с mod_rewrite, но намного проще , если вы не освоите mod_rewrite.

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

Обновление:

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

2 голосов
/ 23 июня 2009
RewriteRule ^roberts-clothing-store/store/([^.]+)/([^.]+)$ store.php?id=$1&page=$2
RewriteRule ^robert-ashcroft/user/([^.]+)$ profile.php?userid=$1
2 голосов
/ 21 июня 2009

Тогда вы можете просто использовать директиву 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.

2 голосов
/ 21 июня 2009

Попробуйте эти правила:

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

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

1 голос
/ 21 июня 2009

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

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

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

Обновление:

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

...