nginx php友好的URL重定向,不会干扰index.php导致/ index

时间:2015-10-09 04:51:27

标签: php redirect nginx

我已经尝试了很多不同的配置来启用永久重定向任何以.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;
}

}

1 个答案:

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