刷新页面显示“找不到页面”

时间:2013-01-05 05:10:48

标签: angularjs

我有一个应用程序,它使用单个ng视图和多个控制器和视图。 如果我浏览根目录,例如:www.domain.com,一切正常。除非我按下Ctrl + R(刷新),否则它会给我404错误页面找不到。例如:在此页面刷新给我错误。 http://domain.com/item/1/

但是,如果我使用hashbang访问该页面,那么它将起作用.eg:http://domain.com/#!/item/1/

我该如何解决这个问题? 我的htacess是空的。我使用chrome支持html5 hashbang。

7 个答案:

答案 0 :(得分:49)

当浏览器调用http://example.com/#!/item/1/时,它正在调用http://example.com/的索引页,然后您的JS通过分析主题标签来确定要显示的内容。

当浏览器调用http://example.com/item/1/时,您的服务器正在尝试提供它无法找到的http://example.com/item/1/索引页,因此会抛出404错误。

要实现您想要的目标,您需要:

  • 创建重写规则以重写指向根索引页的链接
  • 调整您的JS,使其生成主题标签而不是URL。如果您使用的是AngularJS,请使用$locationProvider.html5Mode(false);
  • 关闭html5模式
  • http://example.com/item/1/中放置一个重定向到http://example.com/#!/item/1/的索引页 - 但请注意,每个/ prettyPath /你的克里特都需要重复此操作。

假设您使用的是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,具体取决于您的根索引文件名)。

答案 1 :(得分:19)

您只需在.htaccess

中添加以下脚本即可
RewriteEngine On 
Options FollowSymLinks

RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /#/$1 [L]

答案 2 :(得分:11)

这是URL重写(IIS)的.NET版本

<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>

答案 3 :(得分:3)

这里有很棒的博客帖子...... http://ericduran.io/2013/05/31/angular-html5Mode-with-yeoman/

“这主要是因为你的AngularJS路线不是真正的html页面。例如,如果你的角度应用程序中有一条路线到/ create-order。如果你从app里面链接到它,这个url工作正常但如果用户试图直接转到该页面,服务器将返回404。“

答案 4 :(得分:1)

截至2018年3月,只需在.htaccess文件中添加以下这些行。

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
#RewriteRule ^(.front-end*)$ /front-end [NC,L,QSA]
RewriteRule ^(.*)$ /index.html [NC,L,QSA]  

希望这会对你有所帮助。

答案 5 :(得分:0)

我无法发表评论,但使用HTML modebase href="/"sudo a2enmod rewrite,使用.htaccess重写。我必须{strong} 您网站的可用网站 AllowOverride All

答案 6 :(得分:0)

    <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>

use this as .htaccess