我整天都在忙于此事,但仍然没有成功。我使用了在线 .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 执行以下操作:
- 当请求不包含路径(仅包含域的根目录)时,将请求重写为 /index.php?p=home
- 当请求是文件时,仅返回该文件
- 第三个有点难以理解。您需要将请求重写为 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。