gpt4 book ai didi

mod-rewrite - nginx 重写 : everything but empty base url

转载 作者:行者123 更新时间:2023-12-02 00:05:33 28 4
gpt4 key购买 nike

经过大约 2 个小时的谷歌搜索并尝试了各种方法后,我向您寻求帮助。

任务:
将空白 url 重写为某些内容,并将其他所有内容重写为 nginx 中不同的内容。

所以,如果我导航到 subdomain.somedomain.tld,我想要得到 index.php,如果我去 subdomain.somedomain.tld/BlAaA,我会被重定向到 index.php?url=BlAaA。异常(exception)是/img、/include 下的文件和 index.php 本身。它们不会被重写。

第二部分已经工作,白名单也是如此,但我无法弄清楚或找到一些东西来完成整个想法。

工作部分:

server {
listen 80;
server_name subdomain.domain.tld;

location / {
include php.conf;
root /srv/http/somefolder/someotherfolder/;

if ( $uri !~ ^/(index\.php|include|img) ){
rewrite /(.*) /index.php?url=$1 last;
}

index index.php;
}
}

@pablo-b 提供的答案几乎解决了我的问题。
这种方法只存在两个问题: 1:PHP-FPM 现在需要在/etc/php/php-fpm.conf 中设置/include/下的文件扩展名(例如 style.css、background.jpg),以确保安全.limit_extensions。我原来的 php.conf 按照以下方式工作
location ~ \.php {
#DO STUFF
}

哪个 nginx 不喜欢,因为它有点覆盖了您建议中的位置/index.php 部分。不过,如果有足够的时间,我可以解决这个问题。

2:$request_uri 产生“/whatever”,而不是“whatever”作为我的 url= 参数的值。我当然可以在我的 php 代码中解析出“/”,但是我的原始解决方案没有添加前导“/”。任何优雅的方法来解决这个问题?

最佳答案

我建议避免 if 并利用与使用的模式匹配方法( docs )相关的优先级在不同的位置工作:

#blank url
location = / {
return 302 http://subdomain.domain.tld/index.php;
}

#just /index.php
location = /index.php {
include common_settings;
}

#anything starting with /img/
location ^~ /img/ {
include common_settings;
}

#anything starting with /include/
location ^~ /include/ {
include common_settings;
}

#everything else
location / {
return 302 http://subdomain.domain.tld/index.php?url=$uri_without_slash;
}
在一个名为 common_settings 的单独配置文件中:
include php.conf;
root /srv/http/somefolder/someotherfolder/;
index index.php;
编辑:添加了删除 url 中的第一个斜杠:
在您的 conf 中,在任何 server 指令之外:
map $request_uri $uri_without_slash {
~^/(?P<trailing_uri>.*)$ $trailing_uri;
}

关于mod-rewrite - nginx 重写 : everything but empty base url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18622437/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com