Обновление страницы дает "Страница не найдена"
У меня есть приложение, в котором используется один ng-view и несколько контроллеров и представлений.
Если я перемещаюсь по корню, например: www.domain.com, все работает. Кроме того, если я нажму Ctrl + R (Refresh), то он даст мне 404 eror Страница не найдена. например: обновление на этой странице дает мне ошибку.
http://domain.com/item/1/.
Но если я получаю доступ к странице с помощью hashbang, то она работает .eg: http://domain.com/#!/item/1/
Как я могу исправить эту проблему?
Моя htacess пуста. И Im использует хром, который поддерживает hhml5 hashbang.
Ответы
Ответ 1
Когда браузер вызывает http://example.com/#!/item/1/
, он вызывает страницу индекса http://example.com/
, ваш JS затем определяет, какой контент отображать, анализируя хэштег.
Когда браузер вызывает http://example.com/item/1/
, ваш сервер пытается обслуживать индексную страницу http://example.com/item/1/
, которую он не может найти и, следовательно, выбрасывает ошибку 404.
Для достижения желаемого вам потребуется:
- Создайте правило перезаписи, чтобы переписать ссылки на страницу индекса корня
- настройте JS так, чтобы он генерировал хеш файл вместо URL-адреса. Если вы используете AngularJS, отключите режим html5 с помощью
$locationProvider.html5Mode(false);
или
- поместите индексную страницу в
http://example.com/item/1/
, которая перенаправляется на http://example.com/#!/item/1/
- однако обратите внимание, что это нужно будет повторять для каждого /prettyPath/you crete.
Предполагая, что вы используете Apache, а ваш индексный файл - index.html, попробуйте добавить следующее в свой файл .htaccess, чтобы создать правило перезаписи, прежде чем пытаться выполнить любое из двух других решений.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*) /index.html/#/$1
</IfModule>
Если вы используете чистое решение AngularJS/Ajax без логики на стороне сервера, измените index.php на index.html(или index.htm в зависимости от вашего имени файла корневого индекса).
Ответ 2
Вам нужно просто добавить ниже script в свой .htaccess
RewriteEngine On
Options FollowSymLinks
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /#/$1 [L]
Ответ 3
это версия .NET для перезаписи URL (IIS)
<system.webServer>
<rewrite>
<!--This directive was not converted because it is not supported by IIS: RewriteBase /.-->
<rules>
<rule name="Imported Rule 1" stopProcessing="true">
<match url="^index\.html" ignoreCase="false" />
<action type="None" />
</rule>
<rule name="Imported Rule 2" stopProcessing="true">
<match url="." ignoreCase="false" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
</conditions>
<action type="Rewrite" url="/index.html" />
</rule>
</rules>
</rewrite>
</system.webServer>
Ответ 4
Отличная запись в блоге об этом здесь...
http://ericduran.io/2013/05/31/angular-html5Mode-with-yeoman/
"Это связано главным образом с тем, что ваши маршруты AngularJS не являются актуальными html-страницами. Например, если у вас есть маршрут в вашем приложении angular to/create-order. Этот URL-адрес прекрасно работает, если вы ссылаетесь на него изнутри ваше приложение, но если пользователь попытается перейти непосредственно на эту страницу, сервер вернет 404."
Ответ 5
Я не мог комментировать, но также использовал HTML mode
, base href="/"
, sudo a2enmod rewrite
, используя .htaccess
rewrite. Я должен был AllowOverride All
в и сайтах, доступных на вашем сайте и, /etc/apache2 apache.conf
Ответ 6
<ifModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !index
RewriteCond %{REQUEST_URI} !.*\.(css js|html|png)
RewriteRule (.*) index.html [L]
</ifModule>
используйте это как .htaccess