V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
care
V2EX  ›  NGINX

请教个 Nginx 的 rewrite 问题

  •  
  •   care · 2019-01-06 12:05:51 +08:00 · 3811 次点击
    这是一个创建于 1908 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我 LNMP 环境安装 Nextcloud,因为要设置伪静态,所以根据官方文档做了以下配置:

    location = /phpmyadmin {

       root /var/www/html/nextcloud;
    
       index index.html index.htm index.php;
    
     }
    
    location / {
        rewrite ^ /index.php$request_uri;
    }
    

    我想通过 nginx 访问 phpmyadmin 来管理 mysql,但是我访问 http://localhost/phpmyadmin 时,Nginx 会报 404 错

    误(默认 webroot 是 /var/www/html/nextcloud ),想请教下 location 应该怎么配置才能正确访问到 phpmyadmin

    tail /var/log/nginx/error.log 查看错误信息,报错如下:

    "/usr/share/nginx/html/pma/index.html" is not found (2: No such file or directory)

    第 1 条附言  ·  2019-01-06 20:52:46 +08:00
    不管怎么改都无法访问,所以附上完整的配置文件信息,由于 V 站附言限制,所以分成两个附言来显示配置文件:

    upstream php-handler {
    server unix:/var/run/php/php7.2-fpm.sock;
    }

    server {
    listen 80;
    listen [::]:80;
    server_name cloud.example.com;
    }

    server {
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag none;
    add_header X-Download-Options noopen;
    add_header X-Permitted-Cross-Domain-Policies none;
    add_header Referrer-Policy no-referrer;

    # Remove X-Powered-By, which is an information leak
    fastcgi_hide_header X-Powered-By;

    # Path to the root of your installation
    root /var/www/html/nextcloud/;
    location /pma {
    alias /var/www/html/pma;
    }

    location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
    }

    # rewrite ^/.well-known/webfinger /public.php?service=webfinger last;

    location = /.well-known/carddav {
    return 301 $scheme://$host/remote.php/dav;
    }
    location = /.well-known/caldav {
    return 301 $scheme://$host/remote.php/dav;
    }

    # set max upload size
    client_max_body_size 512M;
    fastcgi_buffers 64 4K;

    # Enable gzip but do not remove ETag headers
    gzip on;
    gzip_vary on;
    gzip_comp_level 4;
    gzip_min_length 256;
    gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
    gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
    第 2 条附言  ·  2019-01-06 20:53:11 +08:00
    #pagespeed off;

    location / {
    rewrite ^ /index.php$request_uri;
    }

    location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ {
    deny all;
    }
    location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
    deny all;
    }

    location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+)\.php(?:$|/) {
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    #fastcgi_param HTTPS on;
    #Avoid sending the security headers twice
    fastcgi_param modHeadersAvailable true;
    fastcgi_param front_controller_active true;
    fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
    fastcgi_intercept_errors on;
    fastcgi_request_buffering off;
    }

    location ~ ^/(?:updater|ocs-provider)(?:$|/) {
    try_files $uri/ =404;
    index index.php;
    }

    # Make sure it is BELOW the PHP block
    location ~ \.(?:css|js|woff2?|svg|gif)$ {
    try_files $uri /index.php$request_uri;
    add_header Cache-Control "public, max-age=15778463";
    # could take several months.
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag none;
    add_header X-Download-Options noopen;
    add_header X-Permitted-Cross-Domain-Policies none;
    add_header Referrer-Policy no-referrer;

    # Optional: Don't log access to assets
    access_log off;
    }

    location ~ \.(?:css|js|woff|svg|gif|png|html|ttf|ico|jpg|jpeg)$ {
    try_files $uri /index.php$request_uri;
    # Optional: Don't log access to other assets
    access_log off;
    }
    }
    21 条回复    2019-01-07 11:01:42 +08:00
    wly19960911
        1
    wly19960911  
       2019-01-06 12:09:28 +08:00 via Android
    看不懂你的规则想表达什么,location / 下面访问哪个目录了?还有 location /phpMyAdmin 居然是 nextcloud 文件夹。
    msg7086
        2
    msg7086  
       2019-01-06 12:12:06 +08:00
    phpmyadmin 指向 nextcloud ?
    gstqc
        3
    gstqc  
       2019-01-06 12:13:30 +08:00 via Android
    location = /phpmyadmin
    改为
    location /phpmyadmin
    care
        4
    care  
    OP
       2019-01-06 12:17:42 +08:00 via iPhone
    @wly19960911 我创建了 default.conf,root 指定的 var/www/html/nextcloud,所以 phpmyadmin 放置在上面的 root 目录内( var/www/html/nextcloud/phpmyadmin )我想通过 http://localhost/phpmyadmin 访问管理 mysql
    care
        5
    care  
    OP
       2019-01-06 12:19:08 +08:00 via iPhone
    @msg7086 我创建了 default.conf,root 指定的 var/www/html/nextcloud,所以 phpmyadmin 放置在上面的 root 目录内( var/www/html/nextcloud/phpmyadmin )我想通过 http://localhost/phpmyadmin 访问管理 mysql,默认通过 http://localhost 现在是可以访问 nextcloud 的,但是访问 phpmyadmin 就不行
    wly19960911
        6
    wly19960911  
       2019-01-06 12:30:46 +08:00 via Android
    我不清楚,这个样子我感觉有可能不仅是这两个规则影响,= 也可以去掉,错误日志和规则表现完全不一样…
    msg7086
        7
    msg7086  
       2019-01-06 12:32:31 +08:00
    1. root 或者 alias 可以直接改 root 地址。你可以在 location /phpmyadmin {} 段里面直接 alias 到另一个目录,不需要把 PMA 复制进 NC 里。(而且复制进 NC 是很不好的习惯。)
    2. root 和 index 一般是放在 server 段里的,而不是放在 location 段里的。
    3. 如上面所说,location 后面的等号要去掉。有等号说明只匹配 /phpmyadmin 而不匹配目录和其中的文件。
    care
        8
    care  
    OP
       2019-01-06 12:34:19 +08:00 via iPhone
    @gstqc 先谢谢你的回复,我试过了不行。
    zen9073
        9
    zen9073  
       2019-01-06 12:36:55 +08:00
    你先把 root 挪到 location 外面来试试
    care
        10
    care  
    OP
       2019-01-06 13:29:10 +08:00 via iPhone
    @zen9073 配置里 server 段已经定义了 root 目录(/var/www/html/nextcloud ),但是还是无法正常访问,所以我 google 了类似的案例,得到的这段 /phpmyadmin 的代码
    care
        11
    care  
    OP
       2019-01-06 14:04:14 +08:00 via iPhone
    @msg7086 这样的话,我是不是重新开个 vhost 来访问 phpmyadmin 的意思?因为现在 default 我用 NC 目录作为 webroot 目录了。
    msg7086
        12
    msg7086  
       2019-01-06 16:55:13 +08:00   ❤️ 1
    @care
    root /xxx/netcloud
    location /pma { alias /yyy/pma; }

    顺便,不要把 phpmyadmin 作为目录的名字,除非你想让别人猜到目录名然后爆破你的数据库密码。
    care
        13
    care  
    OP
       2019-01-06 20:54:23 +08:00
    @msg7086 我用了 alias 还是不行,我上传了完整的配置文档,麻烦您帮忙看下是哪里有问题,谢谢。
    bin456789
        14
    bin456789  
       2019-01-06 21:43:29 +08:00
    location /pma {
    alias /var/www/html/pma/;
    }

    注意最后的斜杆
    care
        15
    care  
    OP
       2019-01-06 21:49:44 +08:00 via iPhone
    @bin456789 也是不行,我就郁闷了。
    msg7086
        16
    msg7086  
       2019-01-07 05:27:23 +08:00
    pma 也是被害重地啊,最好起个完全无关的名字,让人联想不到是 pma 的最好。
    然后我先问一句,你改了配置以后重启过 nginx 么?
    以及你说的不行是怎么个不行? 403 ? 404 ?还是什么。
    care
        17
    care  
    OP
       2019-01-07 06:57:21 +08:00 via iPhone
    @msg7086 我改完配置都会执行 systemctl reload nginx.service 打开 http://localhost/pma 都是报 404
    roadli
        18
    roadli  
       2019-01-07 10:06:18 +08:00
    需要注意 location 的匹配优先级,匹配.php 的正则优先于普通前缀匹配 /pma 了
    linxiaojialin
        19
    linxiaojialin  
       2019-01-07 10:36:44 +08:00
    你可以把 phpmyadmin 做成跟 pma 一样啊,放到。
    location /pma {
    alias /var/www/html/pma;
    }
    linxiaojialin
        20
    linxiaojialin  
       2019-01-07 10:37:46 +08:00
    @linxiaojialin 放到 /var/www/html/phpmyadmin
    care
        21
    care  
    OP
       2019-01-07 11:01:42 +08:00 via iPhone
    @linxiaojialin 我现在已经把 phpmyadmin mv 为 pma 了的,但是打开还是 404 报错,可能就像上面那位朋友说的匹配优先级问题?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1567 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 23:59 · PVG 07:59 · LAX 16:59 · JFK 19:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.