PHP重写页面URL时,$ _ get不起作用

问题描述

我正在使用此URL rewriting with PHP文件夹结构重写URL。我已经做好了,但重写URL后$_GET['cat_id']无法正常工作。现在如何获取数据?请帮忙。我的项目在这里http://199.192.21.232/~admin/category/men-items

脚本

define( 'INCLUDE_DIR',dirname( __FILE__ ) . '/' );

$rules = array( 
    'picture'   => "/picture/(?'text'[^/]+)/(?'id'\d+)",// '/picture/some-text/51'
    'album'     => "/album/(?'album'[\w\-]+)",// '/album/album-slug'
    'category'  => "/category/(?'category'[\w\-]+)",// '/category/category-slug'
    'page'      => "/page/(?'page'about|contact)",// '/page/about','/page/contact'
    'post'      => "/(?'post'[\w\-]+)",// '/post-slug'
    'home'      => "/"                                      // '/'
);

$uri = rtrim( dirname($_SERVER["SCRIPT_NAME"]),'/' );
$uri = '/' . trim( str_replace( $uri,'',$_SERVER['REQUEST_URI'] ),'/' );
$uri = urldecode( $uri );

foreach ( $rules as $action => $rule ) {
    if ( preg_match( '~^'.$rule.'$~i',$uri,$params ) ) {
        include( INCLUDE_DIR . $action . '.PHP' );
        exit();
    }
}

include( INCLUDE_DIR . '404.PHP' );

HTaccess

RewriteEngine On
RewriteRule ^/.*$ index.PHP
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.PHP [QSA,L]

解决方法

在您发布的代码中,没有$_GET['cat_id']变量,除非请求的URL上有一个cat_id URL参数(您未声明)。

如果.htaccess文件和index.php脚本位于http://example.com/~admin/(其中~admin是Apache每个用户的Web目录),则请求的格式为{{ 1}}(如您的示例所示)将导致http://example.com/~admin/category/men-items数组索引的值为$params['category'](来自匹配正则表达式中的命名捕获组)。如果那是您指的是什么?但是这里没有“ cat_id”。


更新:

我现在只想在网站1上有两个链接:men-items和2:/~admin/category.php?cat_id=2。它将在功能中造成内容重复问题,我只需要一个链接,如2:/~admin/category/men-items,因此需要将1个链接重定向到2

要规范化SEO的URL,您可以在/~admin/category/men-items文件顶部执行以下操作:

.htaccess

如果旧的URL RewriteCond %{QUERY_STRING} ^cat_id=2$ RewriteRule ^category\.php$ /~admin/category/men-items [R=301,L] 仍作为物理文件存在,那么您需要确保禁用MultiViews以避免与mod_rewrite冲突。例如,在您的category.php文件的最顶部:

.htaccess