使用 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&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 状态。)
还是不行。所有包含的文件都是这样导入的:<link rel="stylesheet" href="css/menu.css">
但在控制台中,所有导入的文件都给我一个 404,因为它们被重写如下:www.example.com/product/css/main.css
以上是关于使用 PHP 和 .htaccess (mod_rewrite) 管理 slug的主要内容,如果未能解决你的问题,请参考以下文章
使用 .htaccess 删除 .html 和 .php 扩展名