我目前有一个 nginx 配置,除了 URL 不包含斜杠时的小问题外,该配置在所有意图和目的上都可以正常工作。
该网站是 Magento,位于子目录中(相对 URL 问题本身就是一场噩梦,因为其他网站运行时都没有子目录)。问题的根源在于附加查询字符串时没有使用斜杠。
但是,例如:
http://www.example.com/magento/category/
可以正确指向相应页面,但是当我从 URL 中删除斜杠时,它会重定向到http://www.example.com/category。
到目前为止,我已经在 Magento 的核心中添加了一些代码来拦截并在每个 url 的末尾和查询字符串之间添加一个斜杠。
然而,我怀疑这是一个 nginx 问题,通过代码解决它并不是理想的方法。
下面是我为子目录制定的 nginx 配置:
location ~ fr/ {
location ~ (/(app/|includes/|/pkginfo/|var/|report/config.xml)|/\.svn/|/.hta.+) {
deny all;
}
location ~* \.(js|css)$ {
expires 30d;
}
location ~ (\.php|/downloader/?|/report/?)$ {
if ($request_uri ~ /(downloader|report)$){ # no trailing /, redirecting
rewrite ^(.*)$ $1/ permanent;
}
fastcgi_index index.php;
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
if (-e $request_filename) { # check if requested path exists
fastcgi_pass belgiumnlbackend;
}
}
index index.php;
try_files $uri $uri/fr/ @handler;
expires 30d;
# set expire headers
if ($request_uri ~* "\.(ico|css|js|gif|jpe?g|png)$") {
expires max;
}
# set fastcgi settings, not allowed in the "if" block
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/fr/index.php;
fastcgi_param SCRIPT_NAME /fr/index.php;
fastcgi_param SERVER_PORT 80;
fastcgi_param PRODUCTION true;
fastcgi_param HTTPS $sslmode;
fastcgi_index /fr/index.php;
fastcgi_param MAGE_RUN_CODE redacted;
fastcgi_param MAGE_RUN_TYPE store;
# rewrite - if file not found, pass it to the backend
if (!-f $request_filename) {
fastcgi_pass belgiumnlbackend;
break;
}
}
根目录位置运行正常,只是这个子目录有问题。我在这里做错了什么吗?
我快速浏览了 serverfault,没有找到任何可以解决这个问题的方法,不过我可能完全看不见,所以如果这是一个重复的问题,请原谅。
提前致谢!