2009-02-22 7 views
3

В моем проекте у моего /PropertDetail.aspx может получиться 2 querystrings.Перенаправление URL-адреса, который может содержать 1 или 2 запроса с URLRewriter.NET?

первый один для PropertyID /PropertDetail.aspx?PropertyId=5

второй один для языка /PropertDetail.aspx?PropertyId=5&Language=2

EDIT: и эта страница может получить один из них или может получить их обоих, так что мой Rewriter правило должно обрабатывать обе из них

Итак, я установил эти правила в web.config

<rewriter> 
     <rewrite url="^(/.+(\.gif|\.png|\.jpg|\.ico|\.pdf|\.css|\.js)(\?.+)?)$" to="$1" processing="stop" /> 
     <rewrite url="^/(.+)-(.+).aspx$" to="/PropertyDetail.aspx?PropertyId=$2" processing="stop"/> 
     <!--http://localhost:1562/Harika-Gayrimenkul-5.aspx--> 
     <rewrite url="^/(.+)-(.+)-(.+).aspx$" to="/PropertyDetail.aspx?PropertyId=$2&#038;Language=$3" processing="stop"/> 
     <!--http://localhost:1562/Great-Property-5-2.aspx--> 
</rewriter> 

Это все в порядке, если нет языка QueryString, но когда есть язык строк запроса он получает 3-е выражение как PropertyID вместо Язык

Как определить эти два правила на той же странице?

Благодаря

+0

У меня есть намного ближе, взгляните. Остерегайтесь того, что еще может непреднамеренно соответствовать. –

ответ

3

Комбинированный ответ:

<rewriter> 
    <rewrite url="^(/.+(\.gif|\.png|\.jpg|\.ico|\.pdf|\.css|\.js)(\?.+)?)$" to="$1" processing="stop"/> 
    <rewrite url="^.+?([\d]+?)-([\d]+?)\.aspx$" to="/PropertyDetail.aspx?PropertyId=$1&amp;Language=$2" processing="stop"/> 
    <rewrite url="^.+?-([\d]+?)\.aspx$" to="/PropertyDetail.aspx?PropertyId=$1" processing="stop"/> 

</rewriter> 

Это сейчас хорошо работает для многих комбинаций:

/This-is-a-really-long-property-title-555-12 

возвращает PropertyID = 555 и язык = 12.

/This-is-another-really-long-property-title-666 

возвращает PropertyId = 666.

+0

это не сработало. Но есть кое-что, о чем я забыл упомянуть, длина строки может быть намного больше похожа на Great-Property-For-People Когда я использую правила выше, мой запрос вызывает PropertyId = «Great-Estate-5-2», –

+0

Просто проверить его. Обнаружил, что он работает не так. Значит, количество тире до требуемых идентификаторов является переменной? –

+0

Great-Estate-5-2 Название недвижимости = Great Estate | PropertyId = 5 | LanguageId = 2 –

2

Сделать второй параметр (значение языка) необязательно в матче, добавив знак вопроса:

Edit: это исправленная версия, сделано после того, как я понял, что я неправильно понял вопрос немного.

<rewriter> 
    <rewrite url="\.(?:gif|png|jpg|ico|pdf|css|js)(?:\?.*)?$" to="$0" processing="stop"/> 
    <rewrite url="(\d+)(?:-?(\d+)?)\.aspx$" to="/PropertyDetail.aspx?PropertyId=$1&amp;Language=$2" processing="stop"/> 
</rewriter> 

Это очищен и оптимизированная версия о том, что ОП уже работает. Он будет производить вывод в виде

 
/PropertyDetail.aspx?PropertyId=12345&Language=1 (when language is present) 
/PropertyDetail.aspx?PropertyId=12345&Language= (when it isn't) 

Примечание

  • использования в $ 0 обратных ссылок для обозначения всей входной строки без необходимости фактически матча весь входной строки
  • Использование групп, не связанных с захватом (?: ...) Для вещей, которые мы не должны хранить в матче-группы, потому что мы не хотим, чтобы получить свою ценность позже
  • распада отдельных правил для одиночных и двойных аргументов URL-адресов в одном правиле

Оригинальная версия ответа:

<rewriter> 
    <rewrite url="^/(.+?)-(.+?)-?(.+?)?\.aspx$" to="/PropertyDetail.aspx?PropertyId=$2&amp;#038;Language=$3" processing="stop"/> 
</rewriter> 
+0

Вот что я ищу, но Я получил сообщение об ошибке System.ArgumentException: «^/(. +?) - (. +?) -? (. +? +)? \. aspx $ –

+0

По-прежнему меняется количество тире, вызывающее проблемы. –

+0

Что касается исключения аргумента: возможно, обратная косая черта должна быть экранирована (двойная обратная косая черта вместо одной)? – Tomalak

1

Это окончательное решение, которое мы придумали.

<rewriter> 
    <rewrite url="^(/.+(\.gif|\.png|\.jpg|\.ico|\.pdf|\.css|\.js)(\?.+)?)$" to="$1" processing="stop"/> 
    <rewrite url="^.+?([\d]+?)-([\d]+?)\.aspx$" to="/PropertyDetail.aspx?PropertyId=$1&amp;Language=$2" processing="stop"/> 
    <rewrite url="^.+?-([\d]+?)\.aspx$" to="/PropertyDetail.aspx?PropertyId=$1" processing="stop"/> 
</rewriter> 
  • первое правило о типах файлов , которые нам не нужны.
  • второе правило о «если страница получает 2 строку запроса»
  • третье правило о том, если страница получить только один QueryString

Большое спасибо за ваш помогает teknohippy и JasonMArcher

+0

@Barbaros Alp: Я думаю, что неправильно понял ваш оригинальный вопрос, я так и думал, что у вас есть три параметра. Вы можете свернуть свое второе и третье правило в одно: Tomalak

+0

По крайней мере, если вы не возражаете, что параметр« Язык »всегда будет * там * в конце, хотя иногда и пуст. – Tomalak

+0

О, и я обновил свой ответ соответственно. Не то, чтобы в этот момент это имело бы большое значение, но я не хотел оставлять его неправильным. ;-) – Tomalak