我正在尝试从默认 Zend Framework 路由中删除 index.php。我认为应该在服务器级别而不是应用程序上进行更正。(如果我错了,请纠正我,但我认为在服务器端执行此操作效率更高)。
我运行的是 Nginx 0.7.1 和 php-fpm 5.3.3
这是我的 nginx 配置
server {
listen *:80;
server_name domain;
root /path/to/http;
index index.php;
client_max_body_size 30m;
location / {
try_files $uri $uri/ /index.php?$args;
}
location /min {
try_files $uri $uri/ /min/index.php?q=;
}
location /blog {
try_files $uri $uri/ /blog/index.php;
}
location /apc {
try_files $uri $uri/ /apc.php$args;
}
location ~ \.php {
include /usr/local/etc/nginx/conf.d/params/fastcgi_params_local;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_param SERVER_NAME $http_host;
fastcgi_pass 127.0.0.1:9000;
}
location ~* ^.+\.(ht|svn)$ {
deny all;
}
# Static files location
location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$ {
expires max;
}
}
基本上 www.domain.com/index.php/path/to/url 和 www.domain.com/path/to/url 提供相同的内容。
我想使用 nginx 重写来修复这个问题。
答案1
你需要类似这样的地点在每个地点。我只是为/blog
位置写一个例子:
location /blog/ {
try_files $uri $uri/ @blog;
}
location @blog {
rewrite ^/blog/(.*)$ /blog/index.php/$1 last;
}
在您的配置中还发现:您可能希望fastcgi_split_path_info
在 PHP 位置中使用:
location ~ ^(.+\.php)(.*)$ {
include fastcgi_params;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass localhost:9000;
}
看文档了解详情。
答案2
理想的解决方案确实需要应用程序的支持,因为它应该了解自己在哪个路径下运行。这允许它选择要提供的正确资源,并返回正确的链接和重定向。在这种情况下,nginx 配置将如下所示:
location / {
include fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
}
即简单地将 everything[0] 传递给特定的 PHP 脚本。这实际上可能适用于 Zend(我自己没有用过)。
如果应用程序无法修改以理解这一点,那么重写路径和修改内容就会变得一团糟。重写的关键是确保重写的路径不会再次被重写。以下将重写 /index.php 的路径并将其传递给 Zend。
location ~ \.php(/|$) {
include fastcgi_params;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass 127.0.0.1:9000;
}
location / {
rewrite ^/(.*)$ /index.php/$1;
}
如果这不起作用,可能是因为 Zend 没有正确处理请求——检查日志以查看它尝试定位的路径。
但是,这不会导致 HTML 中返回的链接或 Zend 发送的重定向使用不带“index.php”的路径,而且 nginx 似乎没有修改这些路径的机制。检查 Zend 是否有办法配置链接和重定向的根路径。
[0] 您显然希望直接提供静态内容,我已经省略了这一点。
答案3
尝试类似这样的操作:
rewrite ^/(.*)$ /index.php/$1;
答案4
# Rewrite rule adapted for Zend Framework
location / {
index index.php;
if (!-f $request_filename) {
rewrite ^(.*)$ /index.php last;
}
}