URL 重写在 Nginx 中不起作用

Posted

技术标签:

【中文标题】URL 重写在 Nginx 中不起作用【英文标题】:URL Rewrite is not working in Nginx 【发布时间】:2013-10-03 02:45:21 【问题描述】:

,操作系统是 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;
    


【问题讨论】:

【参考方案1】:
location /     
   rewrite ^(.*)$ /index.php?u=$1 last;

【讨论】:

我知道这个答案已经过去了,但你能解释一下吗?【参考方案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

【讨论】:

以上是关于URL 重写在 Nginx 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Htaccess 重写链接在 .htaccess 文件中不起作用

为啥 spdy 在 nginx 1.5.10 中不起作用?

% url % 在 Django 中不起作用

web.config 重写规则在 blob 存储中的 Azure 静态网站中不起作用

域中的 www 在 nginx 中不起作用

为啥 url 重写不起作用?