I have a PHP file:

example.com/products/index.php

My goal is to able to do this:

example.com/products/186/Hello to you

在PHP中,我可以做$_GET['id'],也就是186

$_GET['cat'],这将是"你好".

So far I tried this below, but I get:

您没有访问此资源的权限. 此外,在try 使用ErrorDocument时遇到403禁止错误

Options -MultiViews

RewriteEngine On

# HTTP to HTTPS canonical redirect
RewriteCond %{HTTP_HOST} example\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule (.*) https://example.com/$1 [R=301,L]

# Abort early if the request already maps to (or looks like) a file or directory
RewriteCond %{REQUEST_URI} \.\w{2,4}$ [OR]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

RewriteRule ^(products)/([^/]*)/?(.*) $1/index.php?id=$2&cat=$3 [L]

# 3. Extensionless URLs for other requests  (this below works fine and is for something else)
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule (.*) $1.php [L]

推荐答案

您的"403禁止"问题与最近更新的apache和您请求的URL中的spaces有关.如以下问题所述:

RewriteRule ^(products)/([^/]*)/?(.*) $1/index.php?id=$2&cat=$3 [L]

由于您允许在请求的URL中使用spaces(在请求中编码为%20),因此需要包括B标志才能对反向引用进行URL编码.然而,您的正则表达式似乎过于"灵活",因为它使第三个路径段可选(即.表单/products/anything的URL将被接受)-这是故意的吗?

请try 以下操作:

RewriteRule ^(products)/([^/]*)/?(.*) $1/index.php?id=$2&cat=$3 [B,L]

不过,要只匹配表单/products/<id>/<cat>的URL,则您的RewriteRule pattern应该修改为如下所示:

RewriteRule ^(products)/(\d+)/(.+) $1/index.php?id=$2&cat=$3 [B,L]

关于使用$_SERVER['REQUEST_URI']而不是传递URL参数的 comments 中提到了这一点.这是可以的,但在这种情况下不会节省太多(如果有的话),因为这看起来像是一个孤立的 case ,而不是您站点的其余部分是如何构建的.在这种情况下,您在.htaccess中的规则将变为:

RewriteRule ^(products)/\d+/. $1/index.php [L]

在PHP中,您可以直接从请求的URL路径(存储在$_SERVER['REQUEST_URI']Superglobal中)解析值.例如:

<?php
$urlPath = parse_url($_SERVER['REQUEST_URI'],PHP_URL_PATH);
$urlPathParts = explode('/',$urlPath);
$id = $urlPathParts[1] ?? null;
$cat = $urlPathParts[2] ?? null;

Php相关问答推荐

在AJX请求中使用简写后,FormData出现非法调用错误

我需要多个SELECT语句的结果(使用由php ECHO创建的表中显示的Limit(X)

LaravelEloquent 地根据表中的值提取记录

在WooCommerce产品中按类型对产品属性术语进行分类以供显示

无法在WooCommerce中发送客户笔记邮箱通知

将部分产品排除在WooCommerce的计算附加费之外

通过访问单个产品页面更新WooCommerce产品元数据

在Laravel中修改JSON输出

将数组推送到数组时,数组推送()出现问题

如何保存基于用户 Select 的复选框 Select 模式

PHP -流加密启用服务器切断字节

使用CODIGNITER3中的OR和AND子句进行查询

Laravel路由到控制器传输变量解决方案需要

文件::Files()响应返回空对象数组

使用 PHP,我可以将 foreach 语句放入瞬态中吗?

使用用户元数据填写 woocommerce checkout 字段

向元素添加类时添加循环错误

避免在 WooCommerce 中多次触发挂钩函数

正则表达式 (php) 匹配单个 [ 或单个 ] 但忽略 [[ ]] 之间的任何内容?

PHP获取根据辞职日期自动续订的合同终止日期