将 .htaccess 转换为 nginx 会破坏我的应用程序

将 .htaccess 转换为 nginx 会破坏我的应用程序

我整天都在忙于此事,但仍然没有成功。我使用了在线 .htaccess 到配置转换器,因此我认为它并没有正确地转换所有内容。

以下是我的 .htaccess 文件

    RewriteCond     %{QUERY_STRING} ^$
    RewriteRule     ^((.)?)$        index.php?p=home [L]

    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^(.*)$ $1 [QSA,L]

    RewriteCond     $1 !^(\#(.)*|\?(.)*|\.htaccess(.)*|\.htaccess\.back(.)*|.idea\/(.)*|.svn\/(.)*|admin\.php(.)*|content\/(.)*|download\.php(.)*|ecc\/(.)*|images\/(.)*|index\.php(.)*|install\/(.)*|login\.php(.)*|readme\.txt(.)*|robots\.txt(.)*)
    RewriteRule     ^(.+)$ index.php?url=$1&%{QUERY_STRING} [L]

转换后的 nginx 配置

try_files $uri $uri/ /index.php?url=$uri&$args;
location / {
   if ($query_string ~ "^$"){
    rewrite ^/((.)?)$ /index.php?p=home break;
  }
  if (-e $request_filename){
    rewrite ^(.*)$ /$1 break;
  }
  rewrite ^(.+)$ /index.php?url=$1&$query_string break;
}
location ~* (^(?!(?:(?!(php|inc)).)*/uploads/).*?(php)) {
                try_files $uri = 404;
                fastcgi_split_path_info ^(.+.php)(.*)$;
                fastcgi_pass unix:/tmp/php5-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include /etc/nginx/fastcgi_params;
}

发生的事情是,当我尝试访问类似 的 URL 时/admin.php?p=settings&group=3,它会将我重定向到登录页面(因为我认为它没有携带查询字符串)。当我访问类似/index.php?p=login或的 URL 时,/index.php?p=signup它可以正常工作。

有人能帮我吗? -约翰

答案1

我认为你犯的错误是试图将 htaccess 转换为 nginx conf。这两种配置风格完全不同。更好的方法是尝试实现逻辑nginx 中的 htaccess。

因此,您的 htaccess 执行以下操作:

  1. 当请求不包含路径(仅包含域的根目录)时,将请求重写为 /index.php?p=home
  2. 当请求是文件时,仅返回该文件
  3. 第三个有点难以理解。您需要将请求重写为 index.php?url=&,但有些请求需要保护,例如 '.svn'。

因此,可能是这样的(未经测试):

# Block some bad requests [3], only included a few here to get the idea
location ~ (\.svn|\.htaccess|\.last|robots\.txt) {
    deny all;
}
location / {
    # see if a file or dir corresponding to the request exists and use that [2]
    try_files $uri $uri/ @rewrite;
}
# Rewrites [1] + [3]
location @rewrite {
    rewrite ^$ /index.php?p=home break;
    rewrite $(.*)$ /index.php?url=$1;
}
location ~ \.php$ {
    try_files $uri $uri/ /index.php?url=$uri&$args;
    fastcgi_pass unix:/tmp/php5-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include /etc/nginx/fastcgi_params;
}

正如我所说,未经测试,但这更像 nginx。

相关内容