我正在尝试将为 Apache 编写的应用程序(或其 .htaccess 文件)迁移到 Nginx,但遇到了一个我无法理解的问题。我来自 Apach 环境,所以这对我来说很新。
我有以下文件夹结构:
/var/www/mydomain.tld/
└── web
├── error
├── favicon.ico
├── my_application
├── index.html
└── robots.txt
web
是 mydomain.tld 的 www-root-folder,我的应用程序在 中/web/my_aplication/
。当调用 www.my_domain.tld 时,我想在 /my_application 中提供应用程序。
标准指令由 ISPConfig 自动创建,但我想我需要添加几行,但我不确定我做错了什么。以下是相关部分(我猜):
server {
listen 1.2.3.4:80;
server_name my_domain.tld;
root /var/www/mydomain.tld/web;
## force www - added this myself
if ($http_host !~ "^www\.") {
rewrite ^(.*)$ http://www.$http_host$request_uri redirect; }
## rewrite to /my_application/ and last
if ($http_host ~* "^www.my_domain.tld$") {
rewrite ^/(.+)$ /my_application/$1 last; }
index index.php index.html index.htm index.cgi index.pl index.xhtml;
error_page 400 /error/400.html;
# ....
recursive_error_pages on;
location = /error/400.html {
internal;
}
## ....
**** this part here is explained below ****
}
除了 force-www-part 之外,这些指令都是自动生成的,实际上应该可以正常工作。
但现在需要翻译 my_application 文件夹中的 .htaccess-rules。我使用了htaccess 到 nginx 转换器并将一些 Nginx 指令包装在其中location / { ... }
。我将位置更改为 /my_application,并将指令放在上面提到的位置:
locaction /my_application {
rewrite (.*/)?info/([A-Za-z0-9_-]+)\.html.* /shop_content.php?gm_boosted_content=$2&$query_string break;
rewrite (.*/)?([A-Za-z0-9_-]+)\.html /product_info.php?gm_boosted_product=$2&$query_string break;
rewrite (.*/)?([A-Za-z0-9_-]+)/?.* /index.php?gm_boosted_category=$2&$query_string break;
}
## These are automatically generated directives for the root-folder (web, I guess).
## Please note that I have placed my own directives above them, I don't know
## if that mattes though.
location ~ \.php$ {
try_files $uri =404;
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9010;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_intercept_errors on;
}
所以,实际上没有什么太花哨的,但我就是无法让它工作......会发生什么:index.php 正在下载(未执行)。但我不太清楚为什么,因为这种方法与我通过 Google 找到的方法非常相似。但我可能遗漏了一些东西。
答案1
您在重写时使用了 break 标志,而不是 last。Break 意味着 Nginx 应该重写内部 URI,但不重新评估位置指令,因此它永远不会传递给 PHP,而是发送以供下载。
另外,它被下载但未显示的原因是您没有为 php 文件添加 mime 类型,并且您的 default_type 配置为 application/octet-stream。