我已经尝试了很多不同的配置来启用永久重定向任何以.php结尾的请求,以便在没有.php的情况下重定向到自身。
问题是,我无法通过/index.php将请求重定向到任何目录重定向到/而不是/ index。
示例:
所需行为= /blog/index.php - > /博客/ 当前行为= /blog/index.php - > /博客/索引
是否有一个干净的解决方案让任何包含“index.php”的请求将自己从请求中移除到简单的/,同时仍然从所有其他请求中删除.php而不包括index.php?
我无法按要求运行的两个问题行:
if ($request_uri ~* "^(.*/)index\.php$") { return 301 $1; }
if ($request_uri ~ ^/(.*)\.php$) { return 301 /$1; }
配置:
# Upstream
upstream backend {
server unix:/var/run/php5-fpm.sock;
}
server {
listen 443 ssl;
server_name mysite.net;
# Serving
root /var/www/html/mysite;
charset utf-8;
index index.php;
# Resources
location / {
try_files $uri $uri/ @extensionless-php;
}
location @extensionless-php {
rewrite ^(.*)$ $1.php last;
}
location ~* /includes/(.+)\.php$ {
deny all;
}
location ~ \.php {
try_files $uri =404;
fastcgi_pass backend;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# Status
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
}
答案 0 :(得分:0)
您可能会遇到浏览器在其缓存中先前有301 Moved Permanently
重定向的问题,因此您的某些较新代码不会产生任何影响。
清除缓存,尝试这样的事情:
index index.php;
if ($request_uri ~ ^/([^?]*?)(?:(?<=/)index(?:\.php)?|\.php)(\?.*)?$) { return 301 /$1$2; }
以上一行不仅支持index.php
,还支持just index
as you might have from your earlier question以及.php
,但它也保留了来自$args
的可能查询字符串
为避免仅支持剥离index
,仍支持上述其他功能,请改用以下内容:
if ($request_uri ~ ^/([^?]*?)(?:(?<=/)index)?\.php(\?.*)?$) { return 301 /$1$2; }
P.S。这个技巧的原始解释如下:nginx redirect loop, remove index.php from url。