apache mod-rewrite 到 nginx 重写

apache mod-rewrite 到 nginx 重写

我刚刚从 Apache 更改为 NGINX,并且我正在使用 Zencart 和 Ultimate SEO 来获得友好的 URL。我尝试将 .htaccess 规则转换为 NGINX,但出现“未指定输入文件”或 404 错误。我的原始 .htaccess 如下:

 ErrorDocument 404 /404.html


 Options +FollowSymLinks
 RewriteEngine On




 # From Ultimate SEO URLs
 RewriteRule ^(.*)-p-(.*).html$ index\.php?main_page=product_info&products_id=$2&%{QUERY_STRING} [L]
 RewriteRule ^(.*)-c-(.*).html$ index\.php?main_page=index&cPath=$2&%{QUERY_STRING} [L]
 RewriteRule ^(.*)-m-([0-9]+).html$ index\.php?main_page=index&manufacturers_id=$2&%{QUERY_STRING} [L]
 RewriteRule ^(.*)-pi-([0-9]+).html$ index\.php?main_page=popup_image&pID=$2&%{QUERY_STRING} [L]
 RewriteRule ^(.*)-pr-([0-9]+).html$ index\.php?main_page=product_reviews&products_id=$2&%{QUERY_STRING} [L]
 RewriteRule ^(.*)-pri-([0-9]+).html$ index\.php?main_page=product_reviews_info&products_id=$2&%{QUERY_STRING} [L]
 RewriteRule ^(.*)-ezp-([0-9]+).html$ index\.php?main_page=page&id=$2&%{QUERY_STRING} [L]



 # All other pages
 # Don't rewrite real files or directories
 RewriteCond %{REQUEST_FILENAME} !-f [NC] 
 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteRule ^(.*).html$ index\.php?main_page=$1&%{QUERY_STRING} [L]

这是我在 NGINX 的 virtual.conf 中添加的内容

 rewrite ^/(.*)-p-(.*).html$ /index\.php?main_page=product_info&products_id=$2&$args last;
 rewrite ^/(.*)-c-(.*).html$ /index\.php?main_page=index&cPath=$2&$args last;
 rewrite ^/(.*)-m-([0-9]+).html$ /index\.php?main_page=index&manufacturers_id=$2&$args last;
 rewrite ^/(.*)-pi-([0-9]+).html$ /index\.php?main_page=popup_image&pID=$2&$args last;
 rewrite ^/(.*)-pr-([0-9]+).html$ /index\.php?main_page=product_reviews&products_id=$2&$args last;
 rewrite ^/(.*)-pri-([0-9]+).html$ /index\.php?main_page=product_reviews_info&products_id=$2&$args last;
 rewrite ^/(.*)-ezp-([0-9]+).html$ /index\.php?main_page=page&id=$2&$args last;
 if (!-f $request_filename){
 set $rule_7 1$rule_7;
}
if (!-d $request_filename){
set $rule_7 2$rule_7;
}
if ($rule_7 = "21"){
rewrite ^/(.*).html$ /index\.php?main_page=$1&$args last;
}

    }

知道我做错了什么吗?

彼得

答案1

如果没有完整的服务器定义,就很难知道发生了什么,因为位置指令是按照特定顺序处理的,并且您的 php 配置可能会导致问题。

无论如何,最明显的问题在于 index.php 重写。不要用斜线转义句号。(index\.php 应该是 index.php)。

至于最后一部分,可以简化:

if (-f $request_filename) {
  break;
}
if (!-d $request_filename) {
  rewrite ^/(.*).html$ /index.php?main_page=$1&$args last;
}

答案2

好吧,你可以先用以下代码替换那些可怕的复合if语句:try_files

try_files $uri $uri/ /index.php?main_page=$uri&$args;

删除指令替换部分中句点上的转义符rewrite也不会有什么坏处;我不知道 nginx 是否按照您的预期处理它们,但它们肯定对您没有任何好处。

除此之外,没有什么看起来特别不合适的地方,所以修复这些问题并检查你的错误日志;404 记录了他们未能找到的内容,这样你就可以看到你做错了什么。

相关内容