Как настроить дополнительные параметры в mod_rewrite - PullRequest
3 голосов
/ 14 октября 2010

Я нахожусь в новом проекте и разрабатываю структуру URL, дело в том, что я хочу, чтобы URL выглядели так: /category-23/keyword/5/ Где нормальная страница: /search.php?q=keyword&cat=23&page=5 Итак, мой вопрос: поля cat и page , должны быть необязательными, я имею в виду, если я перейду к /keyword, это должно быть /search.php?q=keyword (страница 1) и если я пойду к /category/keyword должно быть: /search.php?q=keyword&cat=category&p=1 а также если я пойду к /keyword/5/ должно быть: /search.php?q=keyword&p=5

Теперь у меня есть .htaccess вот так:

RewriteEngine On
RewriteBase /
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)/(.*)/(.*)$ search.php?q=$2&cat=$1&page=$3 [L]

Я не могу заставить его работать, и CSS / файлы изображений не загружаются. Большое спасибо, кто может дать мне решение.

Ответы [ 3 ]

6 голосов
/ 14 октября 2010

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

RewriteRule ^([^/]+)$ search.php?q=$1
RewriteRule ^([^/]+)/([0-9]+)$ search.php?q=$2&p=$1
RewriteRule ^([^/]+)/([^/]+)$ search.php?q=$2&cat=$1&p=1
RewriteRule ^([^/]+)/([^/]+)/([0-9]+)$ search.php?q=$2&cat=$1&p=$3

И с этим правилом перед другими правилами любой запрос, который может быть сопоставлен с существующими файлами, будет проходить через:

RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^ - [L]

Теперь ваша последняя проблема, что внешние ссылки не могут быть найдены, связана с тем, что вы, вероятно, используете относительные пути URL, такие как css/style.css или ./css/style.css.Эти относительные ссылки разрешаются из базового URL-пути, который является URL-путем URL-адреса документа, в котором используются ссылки. Таким образом, в случае запроса /category/keyword относительная ссылка, такая как css/style.css, разрешается в /category/keyword/css/style.css ине /css/style.css.Использование абсолютного пути URL /css/style.css делает его независимым от фактического базового пути URL

1 голос
/ 14 декабря 2012

Не должно ли быть

RewriteCond %{SCRIPT_FILENAME} -f
RewriteRule ^ - [L]

в ответе @ Гамбо выше? Так со мной работает. Если является файлом (например, CSS), дайте ему пройти.

1 голос
/ 29 марта 2011

Хотя я знаю, что @Gumbo несколько месяцев назад ответил на это лаконично, я недавно столкнулся с похожей проблемой ... и не хотел включать в свое приложение полные / абсолютные пути, чтобы поддерживать его динамичность и отсутствие куча APP_PATH (php) переменных повсюду ... так что я просто добавил базовый HTML-тег [href] с

вроде так ...

<base href="http://<?php echo $_SERVER[HTTP_HOST];?><?php echo APP_PATH;?>"/>

Надеюсь, что это поможет другим ... и это не попытка обесценить ответ @ Гамбо в малейшей степени ... они правы:).

...