使用 PHP 和 .htaccess (mod_rewrite) 管理 slug

Posted

技术标签:

【中文标题】使用 PHP 和 .htaccess (mod_rewrite) 管理 slug【英文标题】:Manage slugs with PHP and .htaccess (mod_rewrite) 【发布时间】:2020-11-25 13:39:12 【问题描述】:

让我们调用我的网站:

www.example.com

我有一个这样的 php 文件:

www.example.com/product.php?id=50

我想通过使用来访问它

www.example.com/product/50

但也很重要,我有几个子目录,例如

www.example.com/subsite/product.php?id=50
www.example.com/subsubsite/product.php?id=50

那必须变成

www.example.com/subsite/product/50
www.example.com/subsubsite/product/50

我怎样才能最好地使用 PHP 和 .htaccess 使用 mod_rewrite 来解决它? 我用this one之类的其他问题敲了敲头,但无济于事。

我似乎找不到完美运行的解决方案,处理所有导入的文件,如 CSS、JS 和 PHP 类。

【问题讨论】:

请发布您尝试并认为更正确的方法,以便我们检查错误。 【参考方案1】:

好的,所以这可能不是完整的答案,但应该可以帮助您找到自己的方式。

您可以使用正则表达式来匹配您想要的路径模式。因此,例如,您的 htaccess 可能看起来像...

# Check if module is installed
<IfModule mod_rewrite.c>

RewriteEngine On
RewriteBase /

# Check query for matching pattern and pass id, but also append additional query strings
RewriteCond %REQUEST_FILENAME !-f
RewriteRule ^([^\/]+\/)?product\/([0-9]+)$ /$1product.php?id=$2 [L,QSA]

# If not file or directory on server, send to 404.php
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule . /404.php [L]

</IfModule>

而它的作用是……

1.将 uri 与正则表达式模式匹配

正则表达式:^([^\/]+\/)?product\/([0-9]+)$

    ^ - 字符串开头。 ([^\/]+\/)? - 匹配任何目录(如果存在)并将其存储以供重复使用。 product\/([0-9]+) - 您想要的路径,例如product/50 并存储数字“id”以供重复使用。 $ - 字符串结束。

2。将捕获的目录和 id 传递给我们的文件

像这样:/$1product.php?id=$2 [L,QSA]

    $1 是我们的目录名称,包括尾部斜杠,例如subsubsite/ $2 是我们的产品 ID,例如50 [L,QSA] QSA 标志意味着我们可以访问其他查询字符串参数,例如/product/50?show=all&amp;updated=1。更多关于标志的信息可以在这里找到http://httpd.apache.org/docs/current/rewrite/flags.html#flag_qsa

3. 404 不匹配

像这样:

RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule . /404.php [L]
    !-f如果请求不是文件 !-d如果请求不是目录 /404.php 用于显示 404 错误的文件。

正在获取 ID...

通过上述方法,您可以像这样在 product.php 文件中获取 ID:

$id = (int)$_GET[ 'id' ];

【讨论】:

不幸的是,这不起作用,因为所有包含的文件都没有加载。 @AlanPiralla 试试我更新的答案(包括 RewriteRule 上方的RewriteCond %REQUEST_FILENAME !-f 很好的解释。虽然重写为404.php 的第二条规则似乎不是这里的要求? (旁白:要实现 404“错误文档”,您应该简单地使用 ErrorDocument 404 /404.php,它也可以处理正确的 HTTP 状态。) 还是不行。所有包含的文件都是这样导入的:&lt;link rel="stylesheet" href="css/menu.css"&gt; 但在控制台中,所有导入的文件都给我一个 404,因为它们被重写如下:www.example.com/product/css/main.css

以上是关于使用 PHP 和 .htaccess (mod_rewrite) 管理 slug的主要内容,如果未能解决你的问题,请参考以下文章

使用 htaccess 删除 get 变量和 .php

使用 PHP 和 .htaccess 重写 URL

使用 .htaccess 删除 .html 和 .php 扩展名

.htaccess 重定向 .php 和 .html 请求

使用 PHP 和 .htaccess (mod_rewrite) 管理 slug

如何使用 .htaccess 和 php 制作用户友好的 url