dti3914 2016-07-01 07:11
浏览 113
已采纳

使用NGINX删除.php扩展名

I'm on a NGINX web server and I would like to remove the .php extension from url.

I currently have the following conf :

server {
    server_name www.mywebsite.com mywebsite.com;
    return 301 https://mywebsite.com$request_uri;
}
server {
    listen 443 ssl;

    server_name www.mywebsite.com;
    return 301 https://mywebsite.com$request_uri;

    ssl_certificate /etc/letsencrypt/live/mywebsite.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mywebsite.com/privkey.pem;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
}
server {
    listen 443 ssl;
    root /opt/http/nginx/sites/mywebsite/www;
    index index.php index.html;
    server_name mywebsite.com;

    location / {
        #rewrite ^(/.*)\.html(\?.*)?$ $1$2 permanent;
        try_files $uri $uri/ $uri.php?$args;
    }

    location ~*  \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 365d;
    }

    location ~*  \.(pdf)$ {
        expires 30d;
    }

    client_max_body_size 3M;

    ssl_certificate /etc/letsencrypt/live/mywebsite.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mywebsite.com/privkey.pem;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';

    error_page 403 /index.php;

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    access_log   /var/log/nginx/www.mywebsite.access.log;
    error_log   /var/log/nginx/www.mywebsite.error.log;
}

If tried to follow some similar case instructions but nothing seems to work with my conf.

The problem is that this piece of code

location / {
    try_files $uri $uri/ $uri.php?$args;
}

is working well in two cases :

  1. The client asks for https://mywebsite.com/page.php : OK
  2. The client asks for https://mywebsite.com/page : OK

without rewriting the url !

What I need is to tell NGINX to rewrite the url if the client tries to access a page with the file extension. For example, if I ask for login.php, nginx rewrites 'login', and so on.

It also has to keep the GET params in the url if it has.

So what is the right conf to do that, given that I keep in my code the links to the php files with extension and not the relative urls (I hope NGINX could rewrite them) ? (if I need to set the relative urls in my code I can but I don't want to break my local)

  • 写回答

2条回答

  • dongquweng5152 2016-07-01 08:45
    关注

    I already tried this one, thanks btw, but it doesn't rewrite all the urls. For example :

    <nav class="navbar navbar-inverse navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a class="navbar-brand" href="index.php">
                    <img height="34" src="img/logo.png" alt="Website logo">
                </a>
            </div>
            <div id="navbar" class="navbar-collapse collapse">
                <ul class="nav navbar-nav navbar-right">
                    <?php if (isset($_SESSION['auth'])): ?>
                        <li><a href="logout.php">Logout</a></li>
                    <?php else: ?>
                        <li><a href="register.php">Sing up</a></li>
                        <li><a href="login.php">Sign in</a></li>
                    <?php endif; ?>
                </ul>
            </div><!--/.navbar-collapse -->
        </div>
    </nav>
    

    If I click on the logo, it redirects to index.php and NGINX rewrites the url to /index (only / will be better but why not...), so this is the behavior i'm looking for.

    But if I click on "Sign In" for example, it redirects to login.php and nothing else happen. But if I enter /login, then it works but it seems that NGINX only rewrites the index.php file, so I need it on all pages.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序
  • ¥15 onvif+openssl,vs2022编译openssl64