这让我很抓狂,我不明白它是如何自动工作的。我使用 nginx 作为我的 Web 服务器,并且安装了 Joomla,它具有 URL 重写功能,可以index.php
从 URL 中删除。以前,当我使用 Apache 时,我必须启用 .htaccess 才能RewriteEngine On
使其工作。但是对于 Nginx,当我启用“使用 URL 重写”时,它会自动工作。我只使用将 php 文件传递给 php-fpm 的 Nginx。就是这样。除了 Joomla 文档中给出的内容之外,我没有添加任何特殊的重写规则。我不明白“使用 URL 重写”如何在我启用它时自动工作,因为 Nginx 没有 .htaccess。
这Joomla 文档在这个话题上也没有帮助。在第二步中它说
启用使用 Apache mod_rewrite/URL 重写选项并保存:此选项使用 Apache mod_rewrite 函数消除 URL 的“index.php”部分。
.....
如果此选项导致错误,请参阅如何检查服务器上是否启用了 mod rewrite。如果未启用,并且您可以访问文件 apache/conf/httpd.conf,请打开该文件并检查行 LoadModule rewrite_module modules/mod_rewrite.so 是否已取消注释。如有必要,请取消注释该行并重新启动 Apache Web 服务器。
不知道为什么要在 Nginx 配置中添加这个,因为 Nginx 中没有 mod_rewrite。Joomla 后端的 URL 重写是这样说的:
使用 URL 重写 选择使用服务器的重写引擎来捕获符合特定条件的 URL 并按指示重写它们。适用于 IIS 7 和 Apache。仅限 Apache 用户!激活前将 htaccess.txt 重命名为 .htaccess。激活前将 web.config.txt 重命名为 web.config 并安装 IIS URL 重写模块。
它没有提到 Nginx,但它仍然有效。我在这里挠头。有人能告诉我为什么 Joomla 的 index.php 在 Nginx 中如此容易被删除吗?这是我的 Nginx Vhost 配置:
server {
listen 80;
server_name example.com;
root /var/www/example/public_html;
index index.php index.html index.htm default.html default.htm;
access_log /var/log/nginx/accn_access.log;
error_log /var/log/nginx/accn_error.log;
##
# JOOMLA SEF
##
location / {
try_files $uri $uri/ /index.php?q=$request_uri;
}
##
# PHP scripts to FastCGI
##
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
瞧...这是一个相当简单的配置。神奇的事情发生在哪里?
答案1
奇迹就在这里发生:
try_files $uri $uri/ /index.php?q=$request_uri;
这意味着 nginx 首先检查请求的文件或目录是否存在于文件系统中。如果文件不存在,它会将请求传递给 Joomla,并将原始 URI 传递给参数q
。