Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在angular JS中正确返回404,并包含动态URL(slug)和ng?_Javascript_Angularjs_.htaccess_Angular Ui Router - Fatal编程技术网

Javascript 如何在angular JS中正确返回404,并包含动态URL(slug)和ng?

Javascript 如何在angular JS中正确返回404,并包含动态URL(slug)和ng?,javascript,angularjs,.htaccess,angular-ui-router,Javascript,Angularjs,.htaccess,Angular Ui Router,我目前正在为我们的公司在AngularJS建立一个带有UI路由器的投资组合网站。我们使用的是HTML5 url方案,我已经准备好了标准的.htaccess来将请求重写为index.html(尽管在生产中,这将在.NET服务器上运行) 该网站的某些部分由通过ng include指令呈现的自由格式html文档组成,以允许我们的开发人员和设计师最大限度地自由创建他们想要的页面-例如,可能需要完全不同的布局和媒体的客户案例研究 这些页面都是通过slug参数加载到一个状态,比如“/work/some ca

我目前正在为我们的公司在AngularJS建立一个带有UI路由器的投资组合网站。我们使用的是HTML5 url方案,我已经准备好了标准的.htaccess来将请求重写为index.html(尽管在生产中,这将在.NET服务器上运行)

该网站的某些部分由通过ng include指令呈现的自由格式html文档组成,以允许我们的开发人员和设计师最大限度地自由创建他们想要的页面-例如,可能需要完全不同的布局和媒体的客户案例研究

这些页面都是通过slug参数加载到一个状态,比如“/work/some case study name”。然后,状态处理程序接受slug参数,并将其作为url提供给html文件,以便ng include加载。例如,上面的url将解析为“/partials/case studies/some case study name.html”。这一切都加载到一个指令中

目前,似乎不可能捕捉到输入错误的slug url。无论是通过.htaccess设置还是angular的路由系统,当ng include无法找到请求的html文件时,它总是返回200OK并仅呈现站点的路由

有人知道如果ng include试图加载的文档不存在,如何使其返回404吗


谢谢

我不擅长.htaccess重写配置,但在尝试了几个示例后,我发现这是唯一一个可靠地返回404的资源,这些资源在角度html5设置中确实不存在:

具体而言:

# Apache .htaccess

# angularjs pushstate (history) support:
# See http://www.josscrowcroft.com/2012/code/htaccess-for-html5-history-pushstate-url-routing/
<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) #Add extra extensions needed.
    RewriteRule (.*) index.html [L]
</ifModule>
#Apache.htaccess
#angularjs pushstate(历史)支持:
#看http://www.josscrowcroft.com/2012/code/htaccess-for-html5-history-pushstate-url-routing/
重新启动发动机
重写cond%{REQUEST_FILENAME}-F
重写cond%{REQUEST_FILENAME}-D
重写cond%{REQUEST_URI}!指数
重写条件%{REQUEST\u URI}!。*\。(css | js | html | png)#添加所需的额外扩展。
重写规则(.*)index.html[L]
这与其他(包括angular网站上的官方示例)之间的区别似乎在于匹配特定文件扩展名的规则。当我试图通过ng include加载一个不存在的文件时,我得到了一个404,这正是我想要的

编辑:

另外-对于.NET peeps,下面是等效的web.config:

<?xml version="1.0"?>
<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <rule name="Main Rule" 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=".*\.(css|js|html|png|jpg)" negate="true" />
          </conditions>
          <action type="Rewrite" url="/" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>


可能重复我看过的答案-对我不起作用。在我的例子中,http响应拦截器总是返回200ok,即使它请求的html(通过ng include)不存在。我认为这是因为.htaccess配置使HTML5URL工作。如果我删除了.htaccess,那么答案中的拦截器示例确实有效,但HTML5 URL不起作用。请更改您的htaccess规则,使它们不会重写部分或包含部分的文件夹。