我有以下 .htaccess 文件
DirectoryIndex index.php
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^$ index.php [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>
<ifModule mod_php5.c>
php_flag display_errors Off
</IfModule>
我的代码使用 Apache 运行良好。但现在我使用 Nginx,以下是我的配置
server {
listen 80;
server_name example.com;
root /srv/www/example.com/public_html;
access_log /srv/www/example.com/logs/access.log;
error_log /srv/www/example.com/logs/error.log;
server_tokens off;
if (!-e $request_filename) {
rewrite ^(.*)$ index.php last;
}
location / {
index index.php;
}
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /srv/www/example.com/public_html$fastcgi_script_name;
}
}
但是我的代码不起作用,请帮忙
谢谢
答案1
简单的答案是,apache 中的重写指令与 nginx 中的不同。
查看 nginx 重写文档:http://wiki.nginx.org/HttpRewriteModule
幸运的是,与某些人认为是黑魔法的 mod_rewrite 规则相比,nginx HttpRewriteModule 在构建重写逻辑方面相当容易理解
答案2
首先,您确实应该避免在 nginx 上使用 if。在 nginx wiki 上搜索 ifIsEvil。
那么,您就不需要 nginx rexrite 来处理诸如服务目录、现有文件以及最后的 index.php 等简单的事情。一个简单的 try_files 就可以完成这项工作。阅读 nginx FAQ 并搜索 try_file。
答案3
如果我没记错的话,您有一个 Zend 或其他框架引导程序。在这种情况下,请使用以下配置:
server {
listen 80;
server_name example.com;
root /srv/www/example.com/public_html;
access_log /srv/www/example.com/logs/access.log;
error_log /srv/www/example.com/logs/error.log;
server_tokens off;
try_files $uri $uri/ /index.php?$args;
location = /index.php {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /srv/www/example.com/public_html$fastcgi_script_name;
}
}
或者
server {
listen 80;
server_name example.com;
root /srv/www/example.com/public_html;
access_log /srv/www/example.com/logs/access.log;
error_log /srv/www/example.com/logs/error.log;
server_tokens off;
try_files $uri $uri/ /index.php?$args;
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /srv/www/example.com/public_html$fastcgi_script_name;
}
}