php 项目中的 mod_rewrite 和 PATH_INFO

php 项目中的 mod_rewrite 和 PATH_INFO

我有一个项目$_SERVER['PATH_INFO']在加载页面时读取变量,因此它以以下格式读取页面http://地址/index.php/页面名称我想使用 mod_rewrite 删除 URL 的 index.php 部分,并使之前的 URLhttp://地址/页面名称.如果有人访问http://地址/页面名称,它需要加载页面,就像该人访问过一样http://地址/index.php/页面名称

使用 Nginx,以下配置有效并执行重写...

server {
    listen       80;
    server_name  localhost;

    root   /srv/http/web/html;
    index  index.php;

    location ~ ^/[^/]+\.php($|/) {
        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_split_path_info ^(/[^/]+\.php)(/.*)$;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_param  PATH_INFO        $fastcgi_path_info;
        include        fastcgi_params;
    }

    location ~ .* {
        rewrite ^/(.*)$ /index.php/$1 last;
    }
}

我如何在 apache 中实现这一点。我目前已使其正常运行,以便根目录正确显示,并且使用 index.php 部分写入 URL 也有效。我如何才能使重写规则正常工作,并且仍然能够使用变量$_SERVER['PATH_INFO']?我可以在 .htaccess 中输入什么来使其正常工作?

答案1

$_SERVER["PATH_INFO"]当 php 像模块一样被编译时,您无法直接从 apache 内部更改变量。

但这里有一个解决方法,可以很好地完成这项工作:

  1. 创建一个rewrite_pathinfo.php包含以下内容的文件:

    <?php
    if (!empty($_SERVER['PATH_INFO'])) header("Location: " . $_SERVER['PATH_INFO']);
    $_SERVER['PATH_INFO'] = $_SERVER['REDIRECT_ORIGINAL_PATH'];
    ?>
    
  2. 将其放入您的.htaccess

    php_value auto_prepend_file "/var/www/vhosts/path_to_your/rewrite_pathinfo.php"
    
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule (.*) /index.php [QSA,L,PT,E=ORIGINAL_PATH:/$1]
    

相关内容