angularjs 刷新页面时显示“页面未找到”

kkih6yb8  于 2022-10-31  发布在  Angular
关注(0)|答案(7)|浏览(135)

我有一个应用程序,它使用一个ng-view和多个控制器和视图。如果我通过根目录导航,例如:www.example.com,一切正常。除了如果我点击Ctrl+R(刷新),然后它给我404错误或页面找不到。例如:刷新此页时出现错误. http://example.com/item/1/
但如果我使用hashbang访问该页面,则它works.eg:http://example.com/#!/item/1/
我该怎么解决这个问题呢?我的.htaccess是空的。而且我用的是支持HTML5 hashbang的chrome。

m1m5dgzv

m1m5dgzv1#

当浏览器调用http://example.com/#!/item/1/时,它调用的是http://example.com/的索引页,然后您的JS通过分析标签来确定要显示什么内容。
当浏览器调用http://example.com/item/1/时,服务器尝试提供http://example.com/item/1/的索引页,但无法找到该索引页,因此引发404错误。
要实现您的目标,您需要:

  • 创建重写规则以重写指向根索引页的链接
  • 调整你的JS,使它生成hashtag而不是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,具体取决于根索引文件名)。

dgenwo3n

dgenwo3n2#

您只需在.htaccess中添加以下脚本

RewriteEngine On 
Options FollowSymLinks

RewriteBase /

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

mtb9vblg3#

这是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>
olqngx59

olqngx594#

在这里发表关于此的伟大博客文章... http://ericduran.io/2013/05/31/angular-html5Mode-with-yeoman/
“这主要是因为你的AngularJS路由不是真正的html页面。例如,如果你在angular应用中有一个到/create-order的路由。如果你从应用内部链接到它,这个url可以正常工作,但如果用户试图直接访问该页面,服务器将返回404。”

ruyhziif

ruyhziif5#

截至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]

希望这对你有帮助。

anhgbhbe

anhgbhbe6#

我不能评论,但以及使用HTML modebase href="/"sudo a2enmod rewrite,使用.htaccess重写。我不得不AllowOverride All两个您的网站/etc/apache2 apache.conf可用的网站

mm9b1k5b

mm9b1k5b7#

<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

相关问题