4

URL 重写在 Nginx 中不起作用,操作系统是 Ubuntu 12.4 Lts

打开http://mvc.loc时它正在工作,但是当我尝试打开http://mvc.loc/login 时不工作

404 未找到

nginx/1.1.19

.htaccess

<IfModule !mod_rewrite.c>
    ErrorDocument 500 "mod_rewrite must be enabled"
</IfModule>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?u=$1

mvc.loc 的虚拟主机

server {
    listen 80;
    server_name mvc.loc;
    access_log /var/log/nginx/mvc.loc.access.log;
    error_log /var/log/nginx/mvc.loc.error.log;
    root /usr/share/nginx/www/mvc;

    index       index.php;


    # use fastcgi for all php files
    # Are you sure you have this set up?
    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    # deny access to apache .htaccess files
    location ~ /\.ht {
     deny all;
    }

}
4

2 回答 2

9
location / {    
   rewrite ^(.*)$ /index.php?u=$1 last;
}
于 2013-09-26T22:52:30.877 回答
2

好吧,@NanheKumar 的回答得到了正确的重写,但它忽略了 htaccess 中的前 2 条规则

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

这意味着检查请求是否与文件不匹配并且与目录不匹配,以模仿您可以try_files像这样使用的确切行为

location / {
    try_files $uri $uri/ /index.php?u=$request_uri;
}

这将确保首先直接提供指向资产或目录的请求,然后如果两者都不会将请求传递给index.php

编辑:除非index.php能够提供资产,否则这将导致所有资产(图像、css、javascript 等)显示错误,因为index.php将收到它不期望的参数。想想这样的事情http://example.com/index.php?u=/images/background.jpg

于 2013-09-27T10:00:24.013 回答