удалить часть URL через mod_rewrite - PullRequest
0 голосов
/ 25 июля 2011

Есть ли способ скрыть часть URL через mod_rewrite. В настоящее время я использую часть URL-адреса, .htm, чтобы разделить запрашиваемую страницу и строку запроса.

Пример

http://www.example.com/page/article/single.htm/articleid=8

Это даст мне знать, что запрашиваемая страница:

http://www.example.com/page/article/single

И строка квеста:

article=8

В идеале, я бы хотел, чтобы это работало с таким же URL-адресом без видимого .htm

http://www.example.com/page/article/single/articleid=8

Количество переменных в строке запроса зависит от количества уровней перед .htm, поэтому правило должно быть динамическим

Спасибо

1 Ответ

1 голос
/ 25 июля 2011

Чтобы также сделать несколько параметров строки запроса, как вы хотите, чтобы это выглядело? Я начал с этого, который делает это простым, а потом стал хитрее.

http://www.example.com/page/article/single/articleid=8&anothervar=abc

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

RewriteRule ^([^=]+)/(.+)$ $1.htm?$2 [NC,L]

Это обрабатывает один или несколько параметров строки запроса, но требует по крайней мере один. Это ищет что-нибудь без = до слэша, затем все остальное. По сути, он использует = в качестве индикатора пути по сравнению с частями строки запроса; но на самом деле разбивает его на слеш. (НК - моя привычка; в этом случае она не нужна, но когда я ее опускаю, я забываю об этом, когда это необходимо.)

Чтобы строки запросов были необязательными, чтобы они могли обрабатывать только

http://www.example.com/page/article/single

Мне было проще всего с двумя правилами, вместо того, чтобы пытаться смешать это в одно правило:

RewriteRule ^([^=]+)$ $1.htm [NC,L]
RewriteRule ^([^=]+)/(.+)$ $1.htm?$2 [NC,L]

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

http://www.example.com/page/article/single/articleid=8/anothervar=abc

Это немного волосато, но я думаю, что это работает (не мог отпустить ...)

Другое правило обрабатывает замену слешей на амперсанды, а затем выполняет перезапись, как описано выше. Это было проще держать прямо - может быть, есть способ сделать все это сразу, но это было достаточно сложно для меня:

RewriteRule ^([^=]+)$ $1.htm [NC,L]
RewriteRule ^([^=]+)/([^=]+=[^/]+)/([^=]+=.+)$ $1/$2&$3 [NC,LP]
RewriteRule ^/([^=]+)/(.+)$ /$1.htm?$2 [NC,L]

Первое правило, как указано выше, вообще не обрабатывает строки запросов. Это просто убирает это с пути.

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

Он ищет последний из этих articleid=8/anothervar=abc, где осталось два параметра. Он заменяет косую черту на амперсанд, например articleid=8&anothervar=abc

На словах он ищет (и захватывает в скобках):

(not-equalsign) slash (not-equalsign equalsign not-slash) slash (not-equalsign equalsign anything)

Это выглядит как:

(not-equalsign)                       /page/article/single
slash                                 /
(not-equalsign equalsign not-slash)   articleid = 8
slash                                 /
(not-equalsign equalsign anything)    anothervar = abc

Заменяет последнюю косую черту на амперсанд, а после зацикливания превращает ее в первый черновик, указанный выше: http://www.example.com/page/article/single/articleid=8&anothervar=abc. Третье правило обрабатывает это, как описано выше.

Примечание. Они также предполагают, что все ваши URL будут выглядеть так, поскольку они будут привязаны ко всему .htm. Если вы все еще хотите разрешить явное /something/page.htm, тогда эти правила должны будут не совпадать с .htm, если он уже есть - что-то в этом роде. Или, может быть, первоначальное правило, которое ищет .htm и просто перестает переписывать там. Или, может быть, сделать это только для путей к / страницу.

...