我已经使用LEMP堆栈安装了一个PHP Web应用程序,我需要将一些Apache .htaccess重写规则移植到Nginx等价物。
的.htaccess
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php?/$0 [PT,L]
我已按照其他Stackoverflow答案中的建议尝试了这两项服务:
这是我的服务器块:
server {
listen 80;
listen [::]:80;
listen 443 ssl;
listen [::]:443 ssl;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES$
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/ssl/dhp-2048.pem;
root /var/www/example;
index index.php index.html index.htm index.nginx-debian.html;
server_name example.com;
# return 302 https://example.com$request_uri;
access_log /var/log/nginx/example.access.log;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
第一个转换器生成了这个,我在最后一个花括号之前添加了一个附加位置节。语法检查nginx -t
检出,但Nginx无法重启。
location / {
if (!-e $request_filename){
rewrite ^(.*)$ /index.php?/$0 break;
}
}
第二个转换器生成了一个不同的规则(下面),我在第一个位置节(在try_files下)添加了这个规则,但是当Nginx没有重启时也会破坏配置。
if (!-f $request_filename){
set $rule_0 1$rule_0;
}
if (!-d $request_filename){
set $rule_0 2$rule_0;
}
if ($rule_0 = "21"){
rewrite /.* /index.php?/$0 last;
}
我做错了什么?任何帮助解决这个问题表示赞赏和欢迎。
更新: 我仍然需要帮助。我还没有能够找到第一个为我工作的解决方案。
答案 0 :(得分:0)
将=404
声明中的try_files
字词更改为/index.php?$uri
。
例如:
location / {
try_files $uri $uri/ /index.php?$uri;
}
您的try_files
语句只缺少最终重写规则。请注意,nginx
中的所有URI都包含前导/
。将$uri
替换为$0
应该适合您。
有关详情,请参阅this document。