Перенаправление URL-адреса, который может содержать 1 или 2 запроса с URLRewriter.NET?


3

В моем проекте у моего /PropertDetail.aspx может получиться 2 querystrings.

первый один для 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

У меня есть намного ближе, взгляните. Остерегайтесь того, что еще может непреднамеренно соответствовать. 22 фев. 092009-02-22 16:57:41

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», 22 фев. 092009-02-22 15:12:50

  0

Просто проверить его. Обнаружил, что он работает не так. Значит, количество тире до требуемых идентификаторов является переменной? 22 фев. 092009-02-22 15:23:59

  0

Great-Estate-5-2 Название недвижимости = Great Estate | PropertyId = 5 | LanguageId = 2 22 фев. 092009-02-22 15:32:38

  0

Там вы попробуете новый, который работает для меня. И для более чем одной цифры сейчас, как я полагаю, ваши идентификаторы получат более 10 :) 22 фев. 092009-02-22 15:52:42

  0

:) Большое вам спасибо, я пробовал, и это нормально, когда у меня есть 2 querystrings (propertyId и язык), но если у меня есть только ошибка PropertyId, я получаю сообщение об ошибке. Поговорка Источник не может быть найден 404. Что может быть причина:/ 22 фев. 092009-02-22 18:23:01

  0

теперь моя проблема заключается в том URL /Great-Недвижимость-10 , если есть только один QueryString есть проблема, но если есть два QueryString он отлично работает 22 фев. 092009-02-22 18:46:16

  0

@Barbaros, возьмите то, что имеет teknohippy, и добавьте третье правило перезаписи в конец: <rewrite url = "^. +? - ([\ d] +?) \. aspx $" to = "/ PropertyDetail. aspx? PropertyId = $ 1 "processing =" stop "/> 22 фев. 092009-02-22 19:16:27

  0

@Barbaros, для дальнейшего использования в этом случае 404 означает, что ничто не соответствовало никакому правилу. 22 фев. 092009-02-22 19:26:28

  0

Большое спасибо teknohippy за вашу помощь и JasonMArcher за последний золотой снимок :) добавив <rewrite url = "^. +? - ([\ d] +?) \. Aspx $" to = "/ PropertyDetail.aspx? PropertyId = $ 1 "processing =" stop "/> в качестве третьего правила сделал трюк 22 фев. 092009-02-22 20:35:32

  0

@teknohippy, не могли бы вы добавить это как третье правило, я помечаю его как ответ. <rewrite url = "^. +? - ([\ d] +?) \. aspx $" to = "/ PropertyDetail.aspx? PropertyId = $ 1" processing = "stop" /> 22 фев. 092009-02-22 20:36:18


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 $ 22 фев. 092009-02-22 15:37:16

  0

По-прежнему меняется количество тире, вызывающее проблемы. 22 фев. 092009-02-22 15:45:38

  0

Что касается исключения аргумента: возможно, обратная косая черта должна быть экранирована (двойная обратная косая черта вместо одной)? 22 фев. 092009-02-22 15:53:42

  0

Теперь исключение прошло, но теперь не удается получить ответы. Спасибо за ваше время и усилия. Что может быть proplem, у вас есть когда-либо используемый urlrewriter.net component 22 фев. 092009-02-22 18:25:11


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: Я думаю, что неправильно понял ваш оригинальный вопрос, я так и думал, что у вас есть три параметра. Вы можете свернуть свое второе и третье правило в одно: <rewrite url = "^. +? (\ D +) (?: - (\ d +))? \. Aspx $" to = "/ PropertyDetail.aspx? PropertyId = $ 1 &amp; Язык = $ 2 "processing =" stop "/> 23 фев. 092009-02-23 00:21:20

  0

По крайней мере, если вы не возражаете, что параметр« Язык »всегда будет * там * в конце, хотя иногда и пуст. 23 фев. 092009-02-23 00:22:56

  0

О, и я обновил свой ответ соответственно. Не то, чтобы в этот момент это имело бы большое значение, но я не хотел оставлять его неправильным. ;-) 23 фев. 092009-02-23 00:42:40

  0

Спасибо, Томалак, я проверил ваш ответ, очень большое спасибо за вашу помощь. 23 фев. 092009-02-23 00:49:13