使用NGINX删除.php扩展名

时间:2016-07-01 07:11:46

标签: php nginx url-rewriting

我在NGINX网络服务器上,我想从网址中删除.php扩展名。

我目前有以下内容:

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;
}

如果试图遵循一些类似的案例说明,但似乎没有任何东西可以用于我的conf。

问题是这段代码

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

在两种情况下运作良好:

  1. 客户要求https://mywebsite.com/page.php:确定
  2. 客户要求https://mywebsite.com/page:确定
  3. 不重写网址!

    如果客户端尝试访问具有文件扩展名的页面,我需要告诉NGINX重写URL。例如,如果我要求login.php,nginx会重写“登录”,依此类推。

    如果有的话,它还必须将GET参数保留在URL中。

    那么做到这一点的正确配置是什么,因为我在代码中保留了带扩展名的php文件的链接,而不是相对网址(我希望NGINX可以重写它们)? (如果我需要在我的代码中设置相对URL,我可以,但我不想破坏我的本地)

2 个答案:

答案 0 :(得分:0)

location / {
        try_files $uri $uri.html $uri/ @extensionless-php;
        index index.html index.htm index.php;
    }

    location ~ \.php$ {
        try_files $uri =404;
    }

    location @extensionless-php {
        rewrite ^(.*)$ $1.php last;
    }

这将删除html和php表单网址。More Detail

答案 1 :(得分:0)

我已经尝试过这个了,谢谢顺便说一句,但它没有重写所有的网址。例如:

<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>

如果我点击徽标,它会重定向到index.php,NGINX会将网址重写为/index(只有/会更好,但为什么不...),所以这是我正在寻找的行为。

但是,如果我点击“登录”,它会重定向到login.php并且不会发生任何其他事情。但是,如果我输入/login,那么它可以工作,但似乎NGINX只重写index.php文件,所以我需要在所有页面上。