#.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 перед приведенными выше правилами). У меня НЕ ПОЛУЧИЛОСЬ!! ПОМОГИТЕ!