【问题标题】:.htaccess to nginx: rewrite or internal redirection cycle.htaccess 到 nginx:重写或内部重定向循环
【发布时间】:2011-05-16 02:09:48
【问题描述】:

我正在尝试将两个 .htaccess 文件转换为 nginx。第一个位于根文件夹中,包含以下内容:

RewriteRule ^install/?$ install/index.php [L]
RewriteRule ^freshadmin/?$ freshadmin/$1 [L]
RewriteRule ^i/?$ library/phpThumb/index.php$1 [L]
RewriteRule ^img/(.+).jpg$ image.php?n=productimage&var1=$1 [L]
RewriteRule ^recommends/([A-Za-z0-9-\+]+)/?$ linkfowarder.php?linkname=$1 [L]
RewriteRule ^([A-Za-z0-9-\+]+)/([A-Za-z0-9-\+]+)/([A-Za-z0-9-\+]+)/([A-Za-z0-9-\+]+)/([A-Za-z0-9-\+]+)/?$ index.php?n=$1&var1=$2&var2=$3&var3=$4&var4=$5 [L]
RewriteRule ^([A-Za-z0-9-\+]+)/([A-Za-z0-9-\+]+)/([A-Za-z0-9-\+]+)/([A-Za-z0-9-\+]+)/?$ index.php?n=$1&var1=$2&var2=$3&var3=$4 [L]
RewriteRule ^([A-Za-z0-9-\+]+)/([A-Za-z0-9-\+]+)/([A-Za-z0-9-]+)/?$ index.php?n=$1&var1=$2&var2=$3 [L]
RewriteRule ^([A-Za-z0-9-\+]+)/([A-Za-z0-9-\+]+)/?$ index.php?n=$1&var1=$2 [L]
RewriteRule ^([A-Za-z0-9-\+]+)/?$ index.php?n=$1 [L]
RewriteCond %{DOCUMENT_ROOT}/$1 -f
RewriteCond %{REQUEST_URI} !^/min/
RewriteCond %{REQUEST_URI} !^/install/
RewriteRule ^(.+\.(css|js))$ /min/index.php?f=$1 [L,NE]

第二个位于 /freshadmin/.htaccess,如下所示:

RewriteRule ^styles/(.+)?$ templates/styles/$1 [L]
RewriteRule ^scripts/(.+)?$ templates/scripts/$1 [L]
RewriteRule ^icons/(.+)?$ templates/icons/$1 [L]
RewriteRule ^images/(.+)?$ templates/images/$1 [L]
RewriteRule ^ajax/(.+)?$ ajax/$1 [L]

RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ index.php?controller=$1&action=$2&var1=$3&var2=$4&var3=$5&var4=$6 [L]
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ index.php?controller=$1&action=$2&var1=$3&var2=$4&var3=$5 [L]
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ index.php?controller=$1&action=$2&var1=$3&var2=$4 [L]
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ index.php?controller=$1&action=$2&var1=$3 [L]
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ index.php?controller=$1&action=$2 [L]
RewriteRule ^([A-Za-z0-9-]+)/?$ index.php?controller=$1 [L]

现在我尝试用 http://www.anilcetin.com/convert-apache-htaccess-to-nginx/ 转换这些,但我迷路了。这是我目前所拥有的,它给了我一个 500 内部服务器错误:

  location /freshadmin/ {
    index index.php index.html;
    rewrite ^/freshadmin/styles/(.+)?$ /freshadmin/templates/styles/$1 last;
    rewrite ^/freshadmin/scripts/(.+)?$ /freshadmin/templates/scripts/$1 last;
    rewrite ^/freshadmin/icons/(.+)?$ /freshadmin/templates/icons/$1 last;
    rewrite ^/freshadmin/images/(.+)?$ /freshadmin/templates/images/$1 last;
    rewrite ^/freshadmin/ajax/(.+)?$ /freshadmin/ajax/$1 last;
    rewrite ^/freshadmin/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ /freshadmin/index.php?controller=$1&action=$2&var1=$3&var2=$4&var3=$5&var4=$6 last;
    rewrite ^/freshadmin/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ /freshadmin/index.php?controller=$1&action=$2&var1=$3&var2=$4&var3=$5 last;
    rewrite ^/freshadmin/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ /freshadmin/index.php?controller=$1&action=$2&var1=$3&var2=$4 last;
    rewrite ^/freshadmin/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ /freshadmin/index.php?controller=$1&action=$2&var1=$3 last;
    rewrite ^/freshadmin/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ /freshadmin/index.php?controller=$1&action=$2 last;
    rewrite ^/freshadmin/([A-Za-z0-9-]+)/?$ /freshadmin/index.php?controller=$1 last;
    rewrite ^/freshadmin/?$ /freshadmin/$1 last;
  }

  location / {
    index index.php index.html;
    try_files $uri $uri/ @handler;

    rewrite ^/install/?$ /install/index.php last;
    rewrite ^/i/?$ /library/phpThumb/index.php$1 last;
    rewrite ^/img/(.+).jpg$ /image.php?n=productimage&var1=$1 last;
    rewrite ^/recommends/([A-Za-z0-9-\+]+)/?$ /linkfowarder.php?linkname=$1 last;
    rewrite ^/([A-Za-z0-9-\+]+)/([A-Za-z0-9-\+]+)/([A-Za-z0-9-\+]+)/([A-Za-z0-9-\+]+)/([A-Za-z0-9-\+]+)/?$ /index.php?n=$1&var1=$2&var2=$3&var3=$4&var4=$5 last;
    rewrite ^/([A-Za-z0-9-\+]+)/([A-Za-z0-9-\+]+)/([A-Za-z0-9-\+]+)/([A-Za-z0-9-\+]+)/?$ /index.php?n=$1&var1=$2&var2=$3&var3=$4 last;
    rewrite ^/([A-Za-z0-9-\+]+)/([A-Za-z0-9-\+]+)/([A-Za-z0-9-]+)/?$ /index.php?n=$1&var1=$2&var2=$3 last;
    rewrite ^/([A-Za-z0-9-\+]+)/([A-Za-z0-9-\+]+)/?$ /index.php?n=$1&var1=$2 last;
    rewrite ^/([A-Za-z0-9-\+]+)/?$ /index.php?n=$1 last;
    if (-f $document_root/$1){
      set $rule_10 1$rule_10;
    }
    if ($uri !~ "^/min/"){
      set $rule_10 2$rule_10;
    }
    if ($uri !~ "^/install/"){
      set $rule_10 3$rule_10;
    }
    if ($rule_10 = "321"){
      rewrite ^/(.+\.(css|js))$ /min/index.php?f=$1 last;
    }

  }

  location @handler {
    rewrite / /index.php;
  }

  location ~ \.php$ { ## Execute PHP scripts
        if (!-e $request_filename) {
          rewrite / /index.php last;
        } ## Catch 404s that try_files miss
        expires        off; ## Do not cache dynamic content
        fastcgi_pass   127.0.0.1:9000;
        #fastcgi_param  HTTPS $fastcgi_https;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params; ## See /etc/nginx/fastcgi_params
  }

我知道,这是相当多的代码,但如果有人有想法,我将不胜感激! 谢谢

【问题讨论】:

    标签: .htaccess mod-rewrite nginx


    【解决方案1】:

    乍一看,我可以在这里看到一些问题。在 nginx 中重写的 url 会通过位置并再次重写,所以这个

    rewrite ^/freshadmin/?$ /freshadmin/$1 last;
    

    可能会循环并导致 500 错误。此外,不清楚 $1 在这里意味着什么,它也可能导致问题。这个应该改成:

    rewrite ^/freshadmin/?$ /freshadmin/ break;
    

    避免骑自行车和奇怪的$ 1。可能还有更多类似的错误。

    还有更多:

    rewrite ^/freshadmin/ajax/(.+)?$ /freshadmin/ajax/$1 last;
    

    什么都不做。

    这个

    RewriteCond %{DOCUMENT_ROOT}/$1 -f
    RewriteCond %{REQUEST_URI} !^/min/
    RewriteCond %{REQUEST_URI} !^/install/
    RewriteRule ^(.+\.(css|js))$ /min/index.php?f=$1 [L,NE]
    

    在 nginx 中的处理方式不同:

    location ~ ^/min/|^/install/ {} # capture these two cases and serve them with default root
    location ~ \.(css|js)$ {
        try_files $uri /min/index.php?f=$uri
    }
    

    我建议将所有内容注释掉,然后在错误出现时一一返回规则。

    【讨论】:

      猜你喜欢
      • 2014-04-25
      • 1970-01-01
      • 1970-01-01
      • 2017-04-05
      • 1970-01-01
      • 2013-08-21
      • 2015-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多