Apache / Linux — .htaccess как получить определенную переменную из запроса / URL и применить к перезаписи

#.htaccess #mod-rewrite

#.htaccess #мод-перезапись

Вопрос:

У меня есть правило, которое работает для одного «направления», но не для другого.

Типичным входящим URL / запросом будет: (длинный URL)

http://somedomain.com/getme.pl?dothis=displayamp;partnum=1234567 (может содержать до 9 цифр)

У меня есть это правило в моем файле htaccess:

 RewriteRule ^([0-9]*)$ /getme.pl?dothis=displayamp;partnum=$1 [L]
  

Которая отлично работает для упрощения получения одного из уникальных номеров детали:

 http://somedomain.com/1234567.
  

Тем не менее, я хотел бы сделать длинный URL «красивым», поэтому я предположил, что могу изменить его (иш).

Итак, при нажатии на ссылку на сайте (длинный URL) файл htaccess преобразует длинный URL в улучшенную версию.

Я пробовал МНОГО попыток. Вот мой последний сбой.

 RewriteRule ^([0-9]*)$ /getme.pl?dothis=displayamp;partnum=$1 [L] #(works)
RewriteCond %{QUERY_STRING} ^partnum=([0-9]*) #(tried to get partnum)
RewriteRule ^.* http://%{HTTP_HOST}/%1 [R] #(make the short url)
RewriteRule ^([0-9]*)$ /getme.pl?dothis=displayamp;partnum=$1 [L] #(the known working rule)
  

Я перепробовал множество правил и посетил множество сайтов за советом.
Я пробовал использовать только правила, только условия и вариации query_string.

Итак, я считаю, что я должен просто взять «partnum» из запроса и переписать в / 1234567 или http_host / 1234567

Затем разрешите обработку другому правилу (works).

Итак, ОБА:

 http://somedomain.com/getme.pl?dothis=displayamp;partnum=1234567
  

и

 http://somedomain.com/1234567
  

Отображать как: http://somedomain.com/1234567 в браузере.

и оба передали весь запрос в getme.pl скрипт должным образом.

Я нашел здесь несколько близких ответов, но ни один из них действительно не объяснял, что мне нужно.

Кто-нибудь, пожалуйста, может помочь?

Ответ №1:

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

 # Your working rewrite, with extra param on the rewrite
RewriteRule ^([0-9]*)$ /getme.pl?dothis=displayamp;partnum=$1amp;rewrite [L]

# Redirect for long urls, to pretty url
# -The appended 'amp;rewrite' on the first rule will force this not to match
# -The trailing '?' on the rewrite will strip the query string
RewriteCond %{QUERY_STRING} partnum=([0-9]*)$
RewriteRule (.*) /%1? [L,R=301]
  

Надеюсь, это поможет.

Комментарии:

1. Сработало хорошо! Спасибо. Я действительно нахожу странным, что мне действительно нужно «обмануть» перезапись, чтобы заставить ее работать, но ЭТО РАБОТАЕТ! Еще раз спасибо!

2. Приятно слышать! Да, mod_rewrite немного сбивает с толку, но поскольку для первого правила используется внутреннее перенаправление, правила применяются еще раз для этого перенаправления.

3. Основываясь на том, что я узнал здесь, я попытался также ПЕРЕПИСАТЬ somedomain.com/difrent.php?notsame=1234567 к just /1234567 или к моему somedomain.com/getme.pl?dothis=displayamp;partnum=1234567 версия, как мы делали выше. (помещаем /1234567 перед приведенными выше правилами). У меня НЕ ПОЛУЧИЛОСЬ!! ПОМОГИТЕ!