Есть ли лучший способ сделать это регулярное выражение? - PullRequest
0 голосов
/ 21 сентября 2009

Я наконец-то нашел хороший / простой способ сделать чистые URL с регулярным выражением на моем сайте в этом формате ниже, однако для этого потребуется очень большой файл .htaccess, я знаю из поста, что он не должен из-за плохой производительности нужно использовать mod_rewrite, но я никогда не видел, чтобы он использовался там, где я есть, с отдельной записью почти для каждой страницы моего сайта.

Ниже приведен пример записи, есть 2 записи на 1 страницу, первая запись перезаписывает

http://www.example.com/users/online/friends/
до
http://www.example.com/index.php?p=users.online.friends

Это прекрасно работает, но если пользователь не на первой странице, то в URL для пейджинга добавляется еще одна вещь, и мне пришлось написать еще одну запись для перезаписи, когда это происходит, это правильный путь или они должны быть объединены как-то?

RewriteRule ^users/online/friends/*$ ./index.php?p=users.online.friends&s=8
RewriteRule ^users/online/friends/(\d+)/*$ ./index.php?p=users.online.friends&s=8&page=$1

Второй сделает это

http://www.example.com/users/online/friends/22/
до
http://www.example.com/index.php?p=users.online.friends&page=22

Ответы [ 3 ]

3 голосов
/ 21 сентября 2009

Это зависит от того, что вы считаете более читабельным, но вот как вы могли бы сделать это с помощью одного правила:

RewriteRule ^users/online/friends(/(\d+))?/*$ ./index.php?p=users.online.friends&s=8&page=$2

( Отредактировано , чтобы быть более точным для обработки косой черты в исходном вопросе. Было: RewriteRule ^ users / online / friends / ((\ d +) / *)? $ ./Index .php? р = users.online.friends & s = 8 & страница = $ 2 )

Здесь я только что поставил "(...)?" вокруг последней части URL, чтобы сделать его необязательным, и изменила обратную ссылку на $ 2.

Конечно, это действительно переписывает http://www.domain.com/users/online/friends/ как:

http://www.domain.com/index.php?p=users.online.friends&page=

Таким образом, ваш PHP-код должен будет проверить, является ли параметр страницы непустым.

3 голосов
/ 21 сентября 2009

Да, все в порядке. Я думаю, что они могут быть объединены в одно правило, но в этом нет особой необходимости.

Вы можете оставить страницу как часть URL, вместо:

http://www.domain.com/users/online/friends/22/

просто есть:

http://www.domain.com/users/online/friends?page=22

и затем есть одно правило что-то вроде:

RewriteRule ^users/online/friends/?$ ./index.php?p=users.online.friends&s=8 [L,QSA]

для добавления строки запроса

Редактировать: Есть несколько способов уменьшить количество правил перезаписи, которые у вас есть.

Во-первых, используйте подстановочные знаки в терминах поиска, например:

RewriteRule ^users/(\w+)/(\w+)$ /index.php?p=users.$1.$2 [L,QSA]

уменьшит целый ряд правил.

Во-вторых, если вы передаете все через /index.php, просто рассмотрите возможность делегирования всех запросов:

RewriteRule ^(users/*)$ /index.php/$1 [L,QSA]

В этом правиле используется третий метод: вместо передачи информации о пути через параметр строки запроса, передайте его через дополнительную информацию о пути. К нему можно получить доступ через $_SERVER['PATH_INFO'].

Это, как говорится, много правил не обязательно плохо. По крайней мере, это ясно обо всех ваших действиях. Однако вы должны остерегаться создания кошмара обслуживания.

2 голосов
/ 21 сентября 2009
# Initial step
RewriteCond %{QUERY_STRING} !(?:^|&)p=
RewriteRule ^([^/]+)/(.+) /$2?p=$1 [QSA]

# Subsequent steps
RewriteCond %{QUERY_STRING} ((?:[^&]*&)*?)p=([^&]*)(.*)
RewriteRule ^([^/]+)/(.+) /$2?%1p=%2.$1%3

# Last step with page number
RewriteRule ^(\d+)/?$ /index.php?page=$1 [QSA,L]

# Last step without page number
RewriteCond %{QUERY_STRING} (?:((?:[^&]*&)*?)p=([^&]*))?(.*)
RewriteRule ^([^/]+)/?$ /index.php?%1p=%2.$1%3 [L]

Это переписало бы URL в несколько шагов:

  1. http://www.domain.com/users/online/friends/22/
  2. http://www.domain.com/online/friends/22/?p=users
  3. http://www.domain.com/friends/22/?p=users.online
  4. http://www.domain.com/22/?p=users.online.friends
  5. http://www.domain.com/index.php?p=users.online.friends&page=22

Более простым методом будет следующий, но вам потребуется изменить свои сценарии:

RewriteRule ^(.*?)(?:/(\d+))?/?$ /index.php?p=$1&page=$2 [QSA,L]

Это будет делать все за один шаг, с небольшой разницей:

  1. http://www.domain.com/users/online/friends/22/
  2. http://www.domain.com/index.php?p=users/online/friends&page=22

Добавление аргумента запроса s=8 потребует дополнительной работы:

  1. Создание текстового файла с номерами меню для каждой страницы.
  2. Добавление директивы RewriteMap.
  3. Изменение второго по значимости правила на тот же RewriteCond, что и у последнего правила.
  4. Добавление &s=%{menumap:%2|0} к двум последним правилам.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...