Url Rewrite отлично работает в Angular Js, но вызывает ошибку 404 при перезагрузке страницы [дубликат]

Для начала вы имеете их назад: & является ссылкой, а * является разыменованием.

Ссылка на переменную означает доступ к адресу памяти переменной:

int i = 5;
int * p;
p = &i; //&i returns the memory address of the variable i.

Выделение переменной означает доступ к переменной, хранящейся по адресу памяти:

int i = 5;
int * p;
p = &i;
*p = 7; //*p returns the variable stored at the memory address stored in p, which is i.
//i is now 7
123
задан Dean 28 September 2012 в 03:55
поделиться

5 ответов

Входящие правила IIS, как показано в вопросе DO, работают. Мне пришлось очистить кеш браузера и добавить следующую строку в верхнюю часть моего раздела <head> на странице index.html:

<base href="/myApplication/app/" />

Это связано с тем, что у меня есть несколько приложений в локальном хосте и поэтому запросы к другим элементам были взяты в localhost/app/view1 вместо localhost/myApplication/app/view1

. Надеюсь, это поможет кому-то!

34
ответ дан Dean 19 August 2018 в 01:01
поделиться
  • 1
    Мне это не нужно, но вопрос был прав. Благодаря! – Ash Clarke 25 January 2013 в 01:05
  • 2
    Также это может быть полезно. Работал для меня при перегрузке страницы. Без каких-либо специальных правил для каждого файла: coderwall.com/p/mycbiq – Per G 27 March 2014 в 20:17
  • 3
    как сказал @ ash-clarke, это необязательно, но это хорошая практика, так как это позволяет связать ссылки на странице с какой-то «подкаталогом». это принадлежит. – Dexter Legaspi 13 May 2014 в 15:54
  • 4
    @PerG Я столкнулся с вышеупомянутым решением, но не на перезагрузке, вот мой код: stackoverflow.com/questions/25644287/iis-url-rewrite-rules Любые идеи? – amcdnl 3 September 2014 в 13:26
  • 5
    Я не знаю или попробовал отфильтровать определенные вызовы. Путь вокруг будет иметь API в другом домене и т. Д. Но, возможно, это не решение для u. Но вы можете продолжить просить в моей ссылке выше. А может, автор может ответить вам? – Per G 4 September 2014 в 13:44

Я выписываю правило в web.config после того, как $locationProvider.html5Mode(true) установлен в app.js.

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

  <system.webServer>
    <rewrite>
      <rules>
        <rule name="AngularJS Routes" stopProcessing="true">
          <match url=".*" />
          <conditions logicalGrouping="MatchAll">
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
            <add input="{REQUEST_URI}" pattern="^/(api)" negate="true" />
          </conditions>
          <action type="Rewrite" url="/" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>

В моем index.html я добавил это в <head>

<base href="/">

Не забывайте установите URL-адрес URL-адреса IIS на сервере.

Также, если вы используете Web API и IIS, это будет работать, если ваш API находится в www.yourdomain.com/api из-за третьего ввода (третья строка состояние).

248
ответ дан bbodenmiller 19 August 2018 в 01:01
поделиться
  • 1
    Это было очень полезно, и я нашел его самым полным. Благодаря! – Mario 20 October 2014 в 15:55
  • 2
    рад, что это помогает @Mario – Yagiz Ozturk 20 October 2014 в 22:00
  • 3
    ИДЕАЛЬНО! Этот вопрос был для меня трудным делом, потратил на это много времени. Благодаря! КОНСУЛЬТАЦИЯ К ЛЮБОМУ ЭЛЕМУ: я добавил index.html в тип & lt; action type = & quot; Rewrite & quot; URL & Quot; /index.html" / & GT; Затем на моем index.html (файл корневого каталога для Angular SPA, & lt; base href = "/index.html" / & gt; Когда я преодолел вышеприведенный код, он не соответствовал моему & lt; base href / & gt; поэтому он не работал правильно. Огромные реквизиты для шаблона «/ (api)» также продолжали спотыкаться по этой части. – Brad Martin 31 December 2014 в 18:38
  • 4
    Хорошее чистое решение, спасибо! – Jason 12 February 2015 в 09:39
  • 5
    Это шутка, что мы должны прыгать через эти обручи для угловой маршрутизации. Это убивает угловую маршрутизацию для меня. Какой беспорядок. – user441521 14 October 2016 в 19:12

Проблема только с этими двумя условиями:

  <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
  <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />

заключается в том, что они работают только до тех пор, пока {REQUEST_FILENAME} существует физически на диске . Это означает, что могут быть сценарии, в которых запрос на некорректно названное частичное представление вернет корневую страницу вместо 404, что может вызвать угловое нагружение дважды (и в некоторых сценариях это может вызвать неприятный бесконечный цикл).

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

  <add input="{REQUEST_FILENAME}" pattern="(.*?)\.html$" negate="true" />
  <add input="{REQUEST_FILENAME}" pattern="(.*?)\.js$" negate="true" />
  <add input="{REQUEST_FILENAME}" pattern="(.*?)\.css$" negate="true" />

или условие, что соответствует любому файлу, заканчивающемуся :

<conditions>
  <!-- ... -->
  <add input="{REQUEST_FILENAME}" pattern=".*\.[\d\w]+$" negate="true" />
</conditions>
7
ответ дан Ciprian Teiosanu 19 August 2018 в 01:01
поделиться
  • 1
    Со всем этим на месте мой сайт загружается просто отлично, но если я на пути по маршруту, у меня есть проблемы. Таким образом, если в моем браузере есть путь: 10.34.34.46/jbvdev/documents/BC498484 Первоначально он отображается хорошо, но если я нажму обновление, все ломается, потому что он начинает искать css и js в 10.34.34.46/jbvdev/documents/css или 10.34.34.46/jbvdev/documents/js Кто-нибудь знает, как решить эту проблему? – Michael Mahony 5 January 2016 в 19:35

В моем случае я продолжал получать 403.14 после того, как я установил правильные правила перезаписи. Оказывается, у меня был каталог, который был тем же именем, что и один из моих URL-маршрутов. Как только я удалил правило перезаписи IsDirectory, мои маршруты работали правильно. Есть ли случай, когда удаление отказа каталога может вызвать проблемы? Я не могу думать ни о чем в моем случае. Единственный случай, о котором я могу думать, - это просмотреть каталог с вашим приложением.

<rule name="fixhtml5mode" stopProcessing="true">
  <match url=".*"/>
  <conditions logicalGrouping="MatchAll">
    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
  </conditions>
  <action type="Rewrite" url="/" />
</rule>
9
ответ дан Josh C 19 August 2018 в 01:01
поделиться

Самый простой способ, который я нашел, - просто перенаправить запросы, которые вызывают 404 для клиента. Это делается добавлением хэштага, даже когда установлен $locationProvider.html5Mode(true).

Этот трюк работает для сред с большим количеством веб-приложений на одном и том же веб-сайте и требует ограничений целостности URL (внешняя аутентификация E.G.). Вот шаг за шагом, как сделать

index.html

Правильно установить элемент <base>

<base href="@(Request.ApplicationPath + "/")">

web.config

Сначала переадресуйте 404 на пользовательскую страницу, например «Главная / Ошибка»

<system.web>
    <customErrors mode="On">
        <error statusCode="404" redirect="~/Home/Error" />
    </customErrors>
</system.web>

Домашний контроллер

Внедрите простой ActionResult для «перевода» ввода в клиентскую route.

public ActionResult Error(string aspxerrorpath) {
    return this.Redirect("~/#/" + aspxerrorpath);
}

Это самый простой способ.


Возможно (рекомендуется?) улучшить функцию Error с некоторой улучшенной логикой для перенаправления 404 только клиенту когда url действителен и пусть 404 запускается нормально, когда на клиенте ничего не будет найдено. Предположим, что у вас есть эти угловые маршруты

.when("/", {
    templateUrl: "Base/Home",
    controller: "controllerHome"
})
.when("/New", {
    templateUrl: "Base/New",
    controller: "controllerNew"
})
.when("/Show/:title", {
    templateUrl: "Base/Show",
    controller: "controllerShow"
})

Имеет смысл перенаправить URL-адрес клиенту только тогда, когда он начинается с «/ New» или «/ Show /»

public ActionResult Error(string aspxerrorpath) {
    // get clientside route path
    string clientPath = aspxerrorpath.Substring(Request.ApplicationPath.Length);

    // create a set of valid clientside path
    string[] validPaths = { "/New", "/Show/" };

    // check if clientPath is valid and redirect properly
    foreach (string validPath in validPaths) {
        if (clientPath.StartsWith(validPath)) {
            return this.Redirect("~/#/" + clientPath);
        }
    }

    return new HttpNotFoundResult();
}

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

1
ответ дан Naigel 19 August 2018 в 01:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: