Nginx重写“目录”语言来查询字符串

时间:2018-04-13 14:48:03

标签: nginx url-rewriting

我正在尝试让Nginx将伪目录重写为要用作语言的查询字符串。例如:

/fr/example.php

应该在URL中看起来像那样,但应该重写为

/example.php?language=fr

以下是我在Nginx配置中尝试过的代码:

rewrite "^(/(fr|en))?/(.*).php$" /$3.php?language=$2 last;

当我访问example.php时,我获得了正确的页面,但是当我访问/fr/example.php时,我收到了404错误。

编辑:这似乎与某个.php扩展名相关。如果我尝试使用.html,它会起作用。但不幸的是我需要它是PHP。以下是我的nginx.conf可能有用的一点,比我上面发布的代码晚了一点:

location / {
    root   /var/www/example.com;
    index  index.php index.html index.htm;

    rewrite "^(/(fr|en))?/(.*).php$" /$3.php?language=$2 last;
}

error_page 404 /404.php;
location /404.php {
    root /var/www/example.com;
}

location ~ \.php$ {
    include snippets/fastcgi-php.conf;

    # CUSTOM
    fastcgi_connect_timeout 60;
    fastcgi_send_timeout 180;
    fastcgi_read_timeout 180;
    fastcgi_buffer_size 128k;
    fastcgi_buffers 256 16k;
    fastcgi_busy_buffers_size 256k;
    fastcgi_temp_file_write_size 256k;
    fastcgi_intercept_errors on;
    # END CUSTOM

    # With php7.0-fpm:
    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}

1 个答案:

答案 0 :(得分:2)

rewrite语句需要位于处理以.php结尾的URI的上下文中,这意味着server块或location ~ \.php$块。

rewrite置于server块中的缺点是nginx测试每个URI的正则表达式,而不仅仅是那些以.php结尾的正则表达式。

在同一rewrite块中处理重写的URI时,break语句应使用location后缀。有关详细信息,请参阅this document

例如:

location ~ \.php$ {
    rewrite ^(/(fr|en))?/(.*)$ /$3?language=$2 break;
    ...
}

您的正则表达式当前匹配每个URI(带或不带语言前缀)。如果这不是必需项,请从正则表达式中删除?。例如:

rewrite ^/(fr|en)/(.*)$ /$2?language=$1 break;