Обновление страницы дает "Страница не найдена"

У меня есть приложение, в котором используется один 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