在nginx

时间:2017-04-12 23:11:34

标签: .htaccess nginx url-rewriting angular-ui-router pretty-urls

(*正如一些评论建议,我已按照this answer删除index.ejs并在项目中使用index.html。所以我调整了我的OP *)

我在Mac中使用apache开发了一个可以请求的MEAN堆栈应用程序 https://localhost:3000/#/home。在使用nginx服务器的生产中,可以请求应用程序  https://www.myapp.io/#/home。由于#,所有情况下都需要片段标识符angular ui-router

所以我想在没有#(例如,https://www.myapp.io/homehttps://localhost:3000/home)的情况下制作漂亮的网址。我做了以下事情:

1)在$locationProvider.html5Mode(true); $locationProvider.hashPrefix('')中添加app.config(['$stateProvider'...

2)在<base href="/" />

中添加了index.html

因此,https://localhost:3000/#/home会自动更改为浏览器栏中的https://localhost:3000/home,类似于https://www.myapp.io/#/home

但是,在浏览器中直接输入https://localhost:3000/homehttps://www.myapp.io/home会引发错误(我不知道如何将<h1><%= message %></h1><h2><%= error.status %></h2><pre><%= error.stack %></pre>中之前的error.ejs转为{ {1}},所以我没有更多细节。

现在,我们的目标是让error.htmlhttps://localhost:3000/home发挥作用。

通过关注this thread,我将以下内容添加到https://www.myapp.io/home

app.js

app.use('/js', express.static(__dirname + '/js')); app.use('/dist', express.static(__dirname + '/../dist')); app.use('/css', express.static(__dirname + '/css')); app.use('/partials', express.static(__dirname + '/partials')); app.all('/*', function(req, res, next) { res.sendFile('index.html', { root: __dirname }); }); 的{​​{1}}中,重新启动apache后,这是我的machttpd-vhosts.conf仍然会返回错误。

apache

在生产中,这是nginx服务器块。重新启动nginx后,https://localhost:3000/home仍然会返回错误。

<VirtualHost *:443>
    ServerName localhost
    DocumentRoot "/Users/SoftTimur"

    SSLEngine on
    SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
    SSLCertificateFile /etc/apache2/ssl/localhost.crt
    SSLCertificateKeyFile /etc/apache2/ssl/localhost.key

    <Directory "/Users/SoftTimur">
        RewriteEngine on

        # Don't rewrite files or directories
        RewriteCond %{REQUEST_FILENAME} -f [OR]
        RewriteCond %{REQUEST_FILENAME} -d
        RewriteRule ^ - [L]

        # Rewrite everything else to index.html to allow html5 state links
        RewriteRule ^ index.html [L]

        Options Indexes FollowSymLinks
        AllowOverride All
        Order allow,deny
        Allow from all
        Require all granted
    </Directory>
</VirtualHost>

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

我认为你应该问自己更好的问题是为什么你没有index.html?也许我已经睡了太久了,但是浏览器实际上不能在网页上自己执行JavaScript,而没有来自HTML文档的底层DOM。

一旦你弄明白了,你可能会成功获得GitHub上angular-ui的官方配置建议。

答案 1 :(得分:0)

删除您添加的nginx配置。这可以通过执行以下操作来实现:

  

有两件事需要做。

     
      
  1. 配置$ locationProvider

  2.   
  3. 设置相关链接的基础

  4.   

有关如何完成此操作的更多详细说明,请参阅以下链接: Pretty URLs in AngularJS: Removing the #

对于Angular 1.6,您还需要更改hashPrefix:

appModule.config(['$locationProvider', function($locationProvider) {
$locationProvider.html5Mode(true);
$locationProvider.hashPrefix('');
}]);

我在你的问题中知道你曾说过你已经完成了这两个步骤,但是如果你完全按照本教程进行操作,它就可以在我自己的Angular应用程序(也是通过nginx托管)上测试它。

要使用服务器配置路由,我建议您点击以下链接: AngularJS with Pretty URLs: Removing the # in Amazon S3

此外,here是要进行的实际服务器配置更改。

最后,我认为你对ejs的运作方式错了。它需要HTML引导(毕竟,你必须有某种index.html,类似<script src="https://npmcdn.com/ejs/ejs.min.js"></script>),或者在服务器上处理(例如,与nodejs和/或朋友)。