Для начала вы имеете их назад: &
является ссылкой, а *
является разыменованием.
Ссылка на переменную означает доступ к адресу памяти переменной:
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
Входящие правила IIS, как показано в вопросе DO, работают. Мне пришлось очистить кеш браузера и добавить следующую строку в верхнюю часть моего раздела <head>
на странице index.html:
<base href="/myApplication/app/" />
Это связано с тем, что у меня есть несколько приложений в локальном хосте и поэтому запросы к другим элементам были взяты в localhost/app/view1
вместо localhost/myApplication/app/view1
. Надеюсь, это поможет кому-то!
Я выписываю правило в 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
из-за третьего ввода (третья строка состояние).
Проблема только с этими двумя условиями:
<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>
В моем случае я продолжал получать 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>
Самый простой способ, который я нашел, - просто перенаправить запросы, которые вызывают 404 для клиента. Это делается добавлением хэштага, даже когда установлен $locationProvider.html5Mode(true)
.
Этот трюк работает для сред с большим количеством веб-приложений на одном и том же веб-сайте и требует ограничений целостности URL (внешняя аутентификация E.G.). Вот шаг за шагом, как сделать
Правильно установить элемент <base>
<base href="@(Request.ApplicationPath + "/")">
Сначала переадресуйте 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();
}
Это всего лишь пример улучшенной логики, конечно, у каждого веб-приложения разные потребности