全球主机交流论坛

标题: 有懂.htaccess转nginx伪静态规则的大佬吗? [打印本页]

作者: 拼命二郎    时间: 2024-3-23 17:50
标题: 有懂.htaccess转nginx伪静态规则的大佬吗?
本帖最后由 拼命二郎 于 2024-3-23 17:56 编辑

求助各位大佬,网上那种转化工具无效,让chatgpt写也无效,请教各位专业的大佬

国外的cms,它自带多语言系统(访问www.abc.com自动跳转到www.abc.com/fr),但是它是基于apache开发的,所以伪静态规则是.htaccess的(如下),我用的是宝塔+Nginx,想将这个伪静态规则转化为适合nginx的,求各位大佬帮助

  1. RewriteCond %{ENV:REDIRECT_REWRITTEN} !=1
  2. RewriteCond %{ENV:REDIRECT_REDIRECT_REWRITTEN} !=1
  3. RewriteRule ^([a-z]{2})/(.*) /$2 [L,QSA,E=REWRITTEN:1,E=LOCALE:$1]
复制代码


官方人员给的建议是:So you need to either find a way to set this (the rule is setting environmental variables REDIRECT_LOCALE=<language code> that is used later by script to switch to a specific locale), or to switch to using subdomains.

chatgpt写的代码如下,不能用
  1. location ~ ^/([a-z]{2})/(.*) {
  2.     if ($redirect_rewritten != "1") {
  3.         rewrite ^/([a-z]{2})/(.*) /$2 last;
  4.         set $locale $1;
  5.     }
  6. }
复制代码

作者: 总有刁民想害朕    时间: 2024-3-23 17:51
辱骂嘲笑gpt直到它写对了为止
作者: 拼命二郎    时间: 2024-3-23 17:54
总有刁民想害朕 发表于 2024-3-23 17:51
辱骂嘲笑gpt直到它写对了为止

用gp4跟它反复拉扯了100条,都没写对,血亏。主要是我不懂代码,不知道让它从哪里开始修正
作者: 1tv    时间: 2024-3-23 17:58
  1. location / {
  2.   rewrite "^/([a-z]{2})/(.*)" /$2;
  3. }
复制代码

作者: 拼命二郎    时间: 2024-3-23 18:01
1tv 发表于 2024-3-23 17:58

代码能正常保存,但是陷入了死循环,请大佬再次指导

该网页无**常运作www.abc.com 将您重定向的次数过多。
作者: 1tv    时间: 2024-3-23 18:18
本帖最后由 1tv 于 2024-3-23 18:27 编辑

  1. location / {
  2.     if ($arg_REDIRECT_REWRITTEN != 1) {
  3.         set $REWRITTEN 1;
  4.         set $LOCALE $arg_LOCALE;
  5.     }
  6.     if ($arg_REDIRECT_REDIRECT_REWRITTEN != 1) {
  7.         rewrite ^/([a-z]{2})/(.*) /$2 last;
  8.     }
  9. }
复制代码

作者: 拼命二郎    时间: 2024-3-23 18:38
1tv 发表于 2024-3-23 18:18

ERROR:
nginx: [emerg] directive "rewrite" is not terminated by ";" in /www/server/panel/vhost/rewrite/abc.com.conf:7
nginx: configuration file /www/server/nginx/conf/nginx.conf test failed

rewrite这行有问题不能保存,可以请大哥再帮帮弟弟吗?万分感谢
作者: 1tv    时间: 2024-3-23 19:04
  1. location / {
  2.     if ($http_accept_language ~* "^(.+)$") {
  3.         set $locale $1;
  4.     }
  5.     rewrite "^/([a-z]{2})/(.*)" /$2 last;
  6. }
复制代码


没辙了
作者: 拼命二郎    时间: 2024-3-23 19:10
1tv 发表于 2024-3-23 19:04
没辙了

还是不行,害,谢谢大佬,有空一起洗脚

我再问问gpt4,要还是不行估计要换为apache了

万分感谢
作者: YorkZhao    时间: 2024-3-23 19:11
以下是用nginx配置实现.htaccess文件功能的示例:

```conf
location / {
  # 防止重复重定向
  if ($env{REDIRECT_REWRITTEN} != 1) {
    set $env{REDIRECT_REWRITTEN} 1;
    if ($env{REDIRECT_REDIRECT_REWRITTEN} != 1) {
      set $env{REDIRECT_REDIRECT_REWRITTEN} 1;
      rewrite ^([a-z]{2})/(.*) /$2 break;
    }
  }
  # 设置语言环境变量
  set $locale $1;
  # 其他配置
}
```

**解释:**

* `if ($env{REDIRECT_REWRITTEN} != 1)`: 检查环境变量 `REDIRECT_REWRITTEN` 是否为 1,如果不是则执行以下重写规则。
* `set $env{REDIRECT_REWRITTEN} 1;`: 将 `REDIRECT_REWRITTEN` 环境变量设置为 1,防止重复重定向。
* `if ($env{REDIRECT_REDIRECT_REWRITTEN} != 1)`: 检查环境变量 `REDIRECT_REDIRECT_REWRITTEN` 是否为 1,如果不是则执行以下重写规则。
* `set $env{REDIRECT_REDIRECT_REWRITTEN} 1;`: 将 `REDIRECT_REDIRECT_REWRITTEN` 环境变量设置为 1,防止重复重定向。
* `rewrite ^([a-z]{2})/(.*) /$2 break;`: 使用正则表达式匹配 URL,并重写为 /$2。`break` 指令阻止 дальнейшее处理。
* `set $locale $1;`: 将捕获的第一个子组 (语言代码) 赋值给环境变量 `locale`。

**注意:**

* 此示例仅供参考,您需要根据实际情况进行调整。
* nginx 配置语法可能与 Apache 的 .htaccess 语法有所不同,请仔细阅读 nginx 文档。

**参考资料:**

* Nginx Rewrite Module: [https://nginx.org/en/docs/http/ngx_http_rewrite_module.html](https://nginx.org/en/docs/http/ngx_http_rewrite_module.html)
* Apache .htaccess Tutorial: [https://httpd.apache.org/docs/current/howto/htaccess.html](https://httpd.apache.org/docs/current/howto/htaccess.html)
作者: 32MB.CN    时间: 2024-3-23 20:55
话说啥CMS,免费收费的?
作者: xiaoli520    时间: 2024-3-24 04:33
gpt垃圾copilot准确多了…我也不知道为什么 我现在基础的翻译都丢给copilot可以试试看
作者: jsdv    时间: 2024-3-24 10:33
本帖最后由 jsdv 于 2024-3-24 10:35 编辑

docker跑个ap.ng反代出来
什么cms,也在找多语版
作者: 姊姊    时间: 2024-3-24 11:04
为什么一定要nginx呢 实在不行就换到apache呗
作者: 电脑    时间: 2024-3-24 22:20
完整的伪静态规则就这3条?
你确定/fr这个是真实存在的目录/文件吗
语言是php吗?

这个规则需要连带fastcgi部分一块修改
作者: 狗几把    时间: 2024-3-24 22:32
我感觉gemini还挺好用的
作者: 拼命二郎    时间: 2024-3-24 23:58
电脑 发表于 2024-3-24 22:20
完整的伪静态规则就这3条?
你确定/fr这个是真实存在的目录/文件吗
语言是php吗?

开发者说.htaccess里面就是靠这三条生效的
/fr是语言网址,目录是不存在的,应该是通过语言包的形式调用的,然后透过伪静态虚拟出来的

They translate https://domain.com/fr/someurl/ into https://domain.com/someurl/ and add ENV variable REDIRECT_LOCALE = fr




欢迎光临 全球主机交流论坛 (https://sunk.eu.org/) Powered by Discuz! X3.4