我有一个PHP脚本处理脚本路由,并做各种花哨的事情。 它最初是为Apachedevise的,但我试图将它迁移到nginx的几个框中。 现在,我正试图在testing服务器上进行平滑处理。
所以脚本的工作方式是使用.htaccess文件拦截目录(在Apache中)的所有HTTPstream量。 以下是这个样子:
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^.+$ index.php [L] </IfModule>
非常简单 所有请求都通过index.php运行,简单明了。
我正在寻找模仿nginx上的行为,但我还没有find一种方法。 有人有什么build议?
这里是我的nginx.conf文件的一个副本。 请注意,它是专为我只是试图让它的工作; 大多是复制/粘贴作业。
user www-data; worker_processes 1; error_log /var/log/nginx/error.log; pid /var/run/nginx.pid; events { worker_connections 1024; # multi_accept on; } http { include /etc/nginx/mime.types; default_type text/plain; include /etc/nginx/conf.d/*.conf; server { listen 80; server_name swingset.serverboy.net; access_log /var/log/nginx/net.serverboy.swingset.access_log; error_log /var/log/nginx/net.serverboy.swingset.error_log warn; root /var/www/swingset; index index.php index.html; fastcgi_index index.php; location ~ \.php { include /etc/nginx/fastcgi_params; keepalive_timeout 0; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass 127.0.0.1:9000; } } }
加这个,
location / { try_files $uri $uri/ /index.php; }
它所做的是首先检查$ uri和$ uri /是否存在真正的文件/文件夹,如果它们不存在,则只需要通过/index.php(这是我的Zend框架设置,通过索引完成路由.php) – 当然,如果你需要传递一些参数,只需要追加到/index.php a?q =就可以了。
确保try_file指令从版本0.7.27开始可用。
我自己想出来了! 是啊!
我所需要的location块是:
location / { include /etc/nginx/fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root/index.php; fastcgi_pass 127.0.0.1:9000; }
其他一切基本保持不变。
设置根目录后添加这个
if (!-e $request_filename) { rewrite ^/(.*)$ /index.php?/$1 last; break; }
根据你的需要,你可能会改变正则expression式,因为你需要把query_string改为index.php
当你的目标是一个PHP文件时要注意的一个非常重要的缺陷是确保你使用的任何return / rewrite规则不会取代location ~ \.php指令的location ~ \.php 。 如果发生这种情况,nginx将为您的PHP文件提供服务,而不会呈现PHP文件,从而揭示PHP源代码。 这可能是灾难性的。
已经提供了最安全的方式, location / { try_files $uri $uri/ /index.php; } location / { try_files $uri $uri/ /index.php; }
确保你还在你的location /块中设置index index.php ,并取消默认configuration文件中的location ~ \.php块的注释。