我在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;
}
在两种情况下运作良好:
不重写网址!
如果客户端尝试访问具有文件扩展名的页面,我需要告诉NGINX重写URL。例如,如果我要求login.php,nginx会重写“登录”,依此类推。
如果有的话,它还必须将GET参数保留在URL中。
那么做到这一点的正确配置是什么,因为我在代码中保留了带扩展名的php文件的链接,而不是相对网址(我希望NGINX可以重写它们)? (如果我需要在我的代码中设置相对URL,我可以,但我不想破坏我的本地)
答案 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
文件,所以我需要在所有页面上。