我正在使用 NGINX 重写规则,但无论我做什么,事情都不会起作用。
当前链接:
/tutorials/index.php?article=2
我多么想要它
/tutorials/2
我的 - 当前 - NGINX 重写conf/规则:
location / {
try_files $uri $uri/ =404 /index.php?$args;
rewrite ^/tutorials/([0-9]+)$ /tutorials/index.php?article=$1 last;
}
我在这里做错了什么?
我的 NGINX 配置文件:
server {
# Hide php extension: ".php"
if (!-e $request_filename) {
rewrite ^(.*)$ /$1.php;
}
# Redirect to HTTPS
if ($scheme = http) { return 301 https://$host$request_uri; }
# Access rule(s)
location / {
try_files $uri $uri/ =404 /index.php?$args;
}
location ~ ^/tutorials/([[:digit:]]+)$ {
rewrite ^ /tutorials/index.php?article=$1 last;
}
# Enable: PHP FPM
location ~ \.php$ {
if ($request_uri ~ /tutorials/index\.php) {
return 302 $scheme://$host/tutorials/$arg_article;
}
# Allow user execution of PHP
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php7.0-alpha.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
client_max_body_size 5M;
}
}
答案1
NGINX 有外部重定向和内部重定向的概念。
听起来您基本上想创建一个重定向循环,但然后根据是否从外部接收到内部请求来进行区分来打破所述循环。
听起来您的外部 URL 规范是:/tutorials/([[:digit:]]+)
。
听起来您的内部 URL 规范是:/tutorials/index.php?article=$1
。
如果是这样,那么您可能需要以下内容:
location ~ ^/tutorials/([[:digit:]]+)$ {
rewrite ^ /tutorials/index.php?article=$1 last;
}
location ~ \.php$ {
if ($request_uri ~ /tutorials/index\.php) {
return 302 $scheme://$host/tutorials/$arg_article;
}
fastcgi_…
}