【问题标题】:Why does my Nginx alias redirect not work (Goes to 404)?为什么我的 Nginx 别名重定向不起作用(转到 404)?
【发布时间】:2017-10-12 10:01:10
【问题描述】:

我的主站点位于 x.com (@/var/www/x.com/index.html)

# MAIN LOCATION
location / {
    # First attempt to serve request as file, then
    # as directory, then fall back to displaying a 404.
    try_files $uri $uri/ =404;
    #autoindex on;
    proxy_set_header X-Real-IP $remote_addr;
}

我希望 /v2 重定向到另一个本地目录 (@/var/www/x.com/v2/public/index.html)

# Redirect beta site
location /v2 {
        alias    /var/www/x.com/v2/public;
}

这似乎应该可以工作,但它会转到我的 404 站点。不确定这是否重要,但这是我的根:

# path
root    /var/www/throneoflies.com/html;

我尝试在 "/" 上方和下方订购 "/v2" - 似乎没有什么不同。我读到我不应该使用“root”而不是“alias”,因为它是不同的架构(/v2/public/ 而不仅仅是/v2/)。

编辑: 似乎它应该可以工作 - 自从这篇文章以来我已经阅读了很多。这是我的完整文件:

server {
        # MAIN >>
        # SSL configuration
        listen                  443 default_server ssl;
        server_name             www.x.com;
        error_page 404          /error/404.html;
        server_tokens           off;

        # SSL
        ssl_certificate         /etc/ssl/x.com/cert.pem;
        ssl_certificate_key     /etc/ssl/x.com/key.pem;
        ssl_protocols           TLSv1 TLSv1.1 TLSv1.2;
        #ssl_session_tickets    off;
        ssl_ciphers             EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
        ssl_prefer_server_ciphers on;

        # path
        root                    /var/www/x.com/html;
        #root                   /var/www/x.com/v2/public; #works!

        # Add index.php to the list if you are using PHP
        #index index.php index.html index.htm index.nginx-debian.html;
        index                   index.html;

        # 404 handling - no cache
        location = /404.html {
                add_header      Cache-Control "no-cache" always;
        }

        # Redirect beta site : Why doesn't it work if the outer block root changed to the same path works? I can REPLACE my "/" with this v2 path np. However, alias at /v2 does not work.
        location = /v2 {
                alias           /var/www/x.com/v2/public;
                #root           /var/www/x.com/v2/public;
                #try_files      $uri $uri/ =404;
        }

        # MAIN LOCATION
        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files       $uri $uri/ =404;
                #autoindex      on;
                proxy_set_header X-Real-IP $remote_addr;

        # DENY .HTACCESS ACCESS
        location ~/\.ht {
                deny all;
        }
}

【问题讨论】:

  • location /v2 块似乎没问题。 /v2 是否在 404 响应之前重定向到 /v2/?外部块中有index 指令吗?
  • 我没有看到可见的重定向,如果这就是你的意思。索引指令?是的,只是index index.html;
  • (这是 CAUGHT 404,而不是来自外部 error_page 404 /error/404.html; 的丑陋 nginx 404)。另外,如果我用我想要做的别名交换主根目录,/v2/public/ 站点会加载 FINE!所以这不是路径问题
  • @RichardSmith 我在上面添加了我的完整文件
  • 您的 EDIT 显示 location = /v2 这与您的原始问题不同(而且肯定不会起作用)

标签: redirect nginx alias


【解决方案1】:

这显然应该是由location = /v2 中的= 引起的,它只会匹配$uri 正好是/v2 的请求;正确的方法很可能是删除=

另外,请注意,如果使用location /v2 {alias /var/www/x.com/v2/public;},那么人们还可以通过/v2.bak 访问/var/www/x.com/v2/public.bak 等内容;如果这不是故意的,那么最好在适当的情况下使用斜杠。

【讨论】:

  • 嗯,第一行已经由 Richard Oct 4th 提出 - 自从提出建议后,我尝试并编辑(+在 Richard 下方评论):这似乎是问题之一,但问题是仍然没有解决。现在研究你的第二个建议。有趣的是,我不认为斜线很重要!没有尾部斜杠的根是否意味着什么?或者根根本不重要,因为我们正在做别名?
  • 作为更新,我尝试了斜杠和相同的。好奇的是,我为与我的主要站点完全相同的位置创建了一个别名,但它也不起作用!别名似乎有严重问题。也许这个街区之外的东西?另一个线索是,如果我将外部块根设置为 /v2/public/ 它可以工作——如果我把根放在里面,它就不起作用。似乎没有别名起作用,如果我再次将它放在内部块上,root 似乎也不会更新。
  • @DylanHunt 你能展示你是如何测试这个的吗? curl -v 也会很有帮助,如果可以请粘贴一些 error.log 行
猜你喜欢
  • 1970-01-01
  • 2017-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-07
  • 2015-12-19
  • 2013-09-05
  • 1970-01-01
相关资源
最近更新 更多