我正在尝试让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;
}
答案 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;