这是一个重写问题,但似乎与重写本身无关——我已尽我所能尝试研究它们。我正在将网站从基于 PHP 的结构移动到 Ghost,并尝试将 URL 以 的形式重定向到 。example.com/blog/blog.php?postid=28
但是example.com/post-title-here/
,每当我尝试访问第一个 URL 来测试重写解决方案时,它只会在 之前立即添加一个斜线,?
然后继续给我 404。我注意到它在没有任何location
基于 的规则的情况下这样做。这是阻止任何重写解决方案工作的原因吗?如果是这样,我该如何阻止它这样做?
example.com.conf
:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://127.0.0.1:2368;
proxy_set_header Host $host;
}
}
答案1
我继续做了一些研究,并回答了我自己的问题。我的配置文件(存储在/etc/nginx/conf.d/
)现在如下所示:
map $query_string $updated_path {
"postid=28" "/proper-path-to-post/";
"postid=27" "/another-proper-path/";
...
}
server {
listen 80;
server_name www.domain.*;
location /blog/blog.php {
rewrite ^/blog/blog.php $updated_path? permanent;
}
location / {
proxy_pass http://127.0.0.1:2368;
proxy_set_header Host $host;
}
}
我没有意识到 nginx 会将任何参数传递给 URL(后面的内容?
)并将其存储在变量中$query_string
,因此我之前的配置无效。map 块基本上按照其名称执行操作 - 将的情况映射$query_string
到帖子的正确路径。然后,在服务器块中,位置/blog/blog.php
根据参数将所有 URL 重写为正确路径。?
末尾的$updated_path
告诉 nginx 不要重新附加传递给 URL 的参数。