Joomla URL 重写在 Nginx 中自动运行

Joomla URL 重写在 Nginx 中自动运行

这让我很抓狂,我不明白它是如何自动工作的。我使用 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

相关内容