多年来,我有一个网站的URL发生了一些重大变化,并且网站上充斥着大量的反向链接,我想避免使用404。
基本上,配置需要...
我无法使用此链接逻辑与try_files一起使用。这是我当前的配置:
server {
listen 443;
server_name www.domain.co.uk;
root /var/www/domain.co.uk;
default_type text/html;
index index.php;
ssl on;
ssl_certificate /etc/ssl/certs/domain.co.uk.crt;
ssl_certificate_key /etc/ssl/private/domain.co.uk.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
ssl_prefer_server_ciphers on;
location / {
try_files $uri $uri/ @extensionless-php @redirect-check;
}
location @extensionless-php {
rewrite ^(.*)$ $1.php;
}
location @redirect-check {
try_files @redirector =404;
}
location @redirector {
rewrite ^(.*)$ /redirection-check?request=$request_uri;
}
location ~ \.php$ {
try_files $uri @redirect-check;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php5.6-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
include fastcgi_params;
}
error_page 400 402 403 404 500 502 503 504 /error?error_type=$status;
}
任何帮助将不胜感激!
答案 0 :(得分:1)
语句try_files $uri $uri/ @extensionless-php @redirect-check;
无效,因为命名位置必须是最后一个参数。有关详情,请参见this document。但是无论如何,@redirect-check
应该从语句中删除,以执行步骤(2)。
语句location @redirect-check { try_files @redirector =404; }
除了生成404响应外没有其他作用。应该将其删除。
如果您将try_files $uri @redirect-check;
更改为try_files $uri @redirector;
,则应该接近您的要求。
您的/redirection-check.php
脚本需要返回404响应才能继续执行步骤(4)。但是您将需要添加fastcgi_intercept_errors on;
来允许error_page
指令处理来自PHP脚本的响应代码。有关详细信息,请参见this document。
答案 1 :(得分:0)
归功于@RichardSmith,他为我指明了正确的方向。
这就是我最终工作得很好的结果:
location / {
try_files $uri $uri/ @extensionless-php;
}
location @redirector {
rewrite ^(.*)$ /redirection-check?request=$request_uri;
}
location @extensionless-php {
rewrite ^(.*)$ $1.php;
}
在重定向检查PHP内,它在$ _GET ['request']上检查数组是否匹配,如果匹配,则提供适当的301重定向。如果不匹配,则返回404。