【问题标题】:How do I Rewrite the URL for both a specific url condition and a general url condition, using .htaccess?如何使用 .htaccess 重写特定 url 条件和一般 url 条件的 URL?
【发布时间】:2025-12-03 22:20:19
【问题描述】:

我正在使用 PHP 开发具有自定义(基本)CMS 系统的网站。 CMS 系统位于 admin.php 下,站点的其余部分位于 index.php 下。

// 项目解释以获取有关问题的更多上下文(针对实际问题跳至下一条评论)//

index.php 和 admin.php 都接受 GET 变量来控制页面的内容。 admin.php 接受 3 个不同的 GET 变量(a、b 和 c),它们定义了不同的功能。

“A”用于主要功能,如“页面 - 不同页面的内容”、“新闻 - 基本博客系统”等。

“B”是专门用于“页面”功能的子链接,用于定义管理员用户正在修改的页面。

“C”也特定于“页面”功能,并定义了管理员用户正在修改的子页面。

然后作为项目“客户端”的 index.php 接受两个 get 变量(A 和 B)

“A”是用户正在访问的页面,在数据库中定义。

“B”是用户正在访问的子页面,-//-.

// 项目扩展结束 //

所以我一直在尝试在 htaccess 中使用 Rewrite 将 URL 重写为更用户友好的字符串。

(admin.php) 示例:admin.php?a=pages&b=home => /admin/pages/home

(index.php) 示例:index.php?a=about&b=team => /about/team

到目前为止,管理员重写条件运行良好。但是我想实现客户端的重写条件,它们发生了冲突。

当前 .htaccess 状态:

RewriteEngine On

RewriteRule ^admin/? admin.php [NC,L]
RewriteRule ^admin/([A-Za-z0-9-&]+)/?$ admin.php?a=$1 [NC,L]
RewriteRule ^admin/([A-Za-z0-9-&]+)/?/([A-Za-z0-9-&]+)/?$ admin.php?a=$1&b=$2 [NC,L]
RewriteRule ^admin/([A-Za-z0-9-&]+)/?/([A-Za-z0-9-&]+)/?/([A-Za-z0-9-&]+)/?$ admin.php?a=$1&b=$2&c=$3 [NC,L]

我一直在查看 htaccess 文档和堆栈上的几个问题,但未能找到可靠的解决方案。

如何根据用户访问的是管理页面还是主(索引)页面来重写 url?

谢谢!

【问题讨论】:

    标签: php apache .htaccess mod-rewrite url-rewriting


    【解决方案1】:

    你可以使用它:

    RewriteEngine On
    
    # skip all files and directories from rewrite rules below
    RewriteCond %{REQUEST_FILENAME} -d [OR]
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^ - [L]
    
    # rewrite admin/
    RewriteRule ^admin/?$ admin.php [QSA,NC,L]
    RewriteRule ^admin/([^/]+)/?$ admin.php?a=$1 [QSA,NC,L]
    RewriteRule ^admin/([^/]+)/([^/]+)/?$ admin.php?a=$1&b=$2 [QSA,NC,L]
    RewriteRule ^admin/([^/]+)/([^/]+)/([^/]+)/?$ admin.php?a=$1&b=$2&c=$3 [QSA,NC,L]
    
    # rewrite others
    RewriteRule ^([^/]+)/?$ index.php?a=$1 [QSA,L]
    RewriteRule ^([^/]+)/([^/]+)/?$ index.php?a=$1&b=$2 [QSA,L]
    

    【讨论】:

    • 奇怪的是,这会清空管理部分的 $_GET 数组,而不是索引...
    • 我只是为此添加了 [QSA] 标志。
    • 是的,我更新了 .htaccess 文件,甚至重新启动了 Apache,但它仍然清空了 $_GET 数组...
    • 当我在 /admin 下添加三个以上的 GET 变量时它也没有反应,但它在常规(索引)部分...
    • 您可以添加更多admin规则超过3个。我不知道您的空$_GET数组有什么问题...