.htaccess : 带有任意数量+参数名称的漂亮 URL

Posted

技术标签:

【中文标题】.htaccess : 带有任意数量+参数名称的漂亮 URL【英文标题】:.htaccess : Pretty URL with whatever number+names of parameters 【发布时间】:2021-10-14 18:11:28 【问题描述】:

你好 ! 我知道已经有很多关于 URL 重写的主题,老实说,我已经花了很多时间尝试将它们应用于我的问题,但我看不到它们中的任何一个完全适用于我的情况(如果你发现其他情况,请给出链接)。 -----

问题来了:

我正在学习 MVC 模型和 URL 重写,我的 URL 是这样的:

http://localhost/blahblahblah/mywebsite/index.php?param1=value1&param2=value2&param3=value3 ... etc ...

我想要的(对于某些 MVC 模板目标)是拥有这种 URL:

http://localhost/blahblahblah/mywebsite/value1/value2/value3 ... etc ...

-----

Whatever 是参数的名称,whatever 是值。 这是我找不到解决方案的最重要的事情。

(也不要介意 localhost blahblahblah,这甚至可以在远程网站上工作,但我相信它会在在线网站上正常工作,这部分 URL 可能对我想做的事情并不重要) 非常感谢您抽出宝贵时间帮助我更清楚地了解我需要做什么。

【问题讨论】:

你想把.htaccess文件放在哪里? 好吧,我的 .htaccess 它位于我正在研究的网站文件夹的根目录中,这有什么关系?另外,我找到了一个临时解决方案,可以让我做我想做的一半。不管参数的名称是什么,但不管有多少。 我做了什么: # RewriteRule ^([a-z0-9_]+)/([a-z0-9_]+)/([a-z0-9_]+)/([a-z0-9_]+)/([a-z0-9_]+)$ index.php?param1=$1&param2=$2&param3=$3&param4=$4&param5=$5 RewriteRule ^([a-z0-9_]+)/([a-z0-9_]+)/([a-z0-9_]+)/([a-z0-9_]+)$ index.php?param1=$1&param2=$2&param3=$3&param4=$4 等等等等... 抱歉格式太糟糕了,*** 在 5 分钟后不允许我编辑,并且在回答评论时没有漂亮的编辑器 ///// 无论如何我所做的是我需要做多少行有多个参数 .htaccess 的位置决定了RewriteRule 指令需要匹配的 URL。在下面写下我的答案后,我刚刚看到您的评论,但是是的,这正是您需要做的。为什么这是“临时解决方案”? 如果您需要提供额外的代码示例,那么您应该编辑您的问题以包含此信息(并保留格式)。 【参考方案1】:

如果 .htaccess 文件位于文档根目录中(即有效地位于 http://localhost/.htaccess),那么您需要使用 mod_rewrite 执行以下操作:

RewriteEngine On

RewriteRule ^(blahblahblah/mywebsite)/(\w+)$ $1/index.php?param1=$2 [L]
RewriteRule ^(blahblahblah/mywebsite)/(\w+)/(\w+)$ $1/index.php?param1=$2&param2=$3 [L]
RewriteRule ^(blahblahblah/mywebsite)/(\w+)/(\w+)/(\w+)$ $1/index.php?param1=$2&param2=$3&param3=$4 [L]
# etc.

其中$n 是对前面RewriteRule 模式(第一个参数)中相应捕获组的反向引用。

UDPATE: \w 是一个速记字符类,匹配 a-zA-Z0-9_(下划线)。

每个参数数量都需要一个新指令。您可以将它们组合成一个(复杂的)指令,但是当只传递几个参数(而不是根本不传递这些参数)时,您将有很多 empty 参数。

我假设您的网址不以斜杠结尾。

但是,如果 .htaccess 文件位于 /blahblahblah/mywebsite 目录中,则可以稍微简化指令:

RewriteRule ^(\w+)$ index.php?param1=$1 [L]
RewriteRule ^(\w+)/(\w+)$ index.php?param1=$1&param2=$2 [L]
RewriteRule ^(\w+)/([\w]+)/([\w]+)$ index.php?param1=$1&param2=$2&param3=$3 [L]
# etc.

不要使用 URL 参数(替代方法)

另一种方法是不将路径段转换为 .htaccess 中的 URL 参数,而是将所有内容传递给 index.php 并让您的 PHP 脚本将 URL 拆分为参数。这允许任意数量的参数。

例如,您的 .htaccess 文件会变得相当简单:

RewriteRule ^\w+(/\w+)*$ index.php [L]

(这里假设.htaccess文件位于/blahblahblah/mywebsite目录下,否则需要如上添加必要的目录前缀。)

RewriteRule pattern 只是验证请求 URL 的形式为 /value1/value1/value2/value1/value2/value3 等。请求被重写为 index.php(前面-控制器)来处理一切。

然后在index.php 中检查$_SERVER['REQUEST_URI'] 并解析请求的URL。

【讨论】:

是的,这几乎就是我作为临时解决方案所做的事情,事情是我想以某种方式对 .htaccess 文件说“自动检测有多少参数并重写它们”。但就目前而言,对于我的网站项目来说,这已经足够了。我只是想为“可能的最佳模板”做一些配置。无论如何,非常感谢您对我的问题感兴趣:) @BriceJoosten 我添加了一个替代解决方案,它不会将 URL 解析为 .htaccess 中的 URL 参数 - 这可能是您所追求的更多。这当然更具可扩展性/灵活性。然后,您必须改为在 PHP 脚本中解析 URL - 但这可以更容易地适应任意数量的“参数”。 我不确定是否完全理解这个替代过程......如果我是对的......你的意思是......这个重写规则确保 url 是某种形式的东西/其他东西直到最后,然后我应该做一个有点像$numberParamGet= count(explode('&', $_SERVER['QUERY_STRING'])); 的整个脚本并将explode 的每个元素(已经完成,它会产生一个php 对象)放在一个变量中,然后我必须将这些包含get params 的变量传递为我的控制器内的功能参数?这似乎是可行的,我将在一个空白测试项目上尝试它。 @BriceJoosten 是的,很好,除了你没有分解查询字符串,而是 URL 路径(基于 /)。如我的回答所述,使用$_SERVER['REQUEST_URI'],其中包含/value1/value2/value3 等形式的字符串,基于您示例中请求的URL。然后你有一个参数值数组。 “不是分解查询字符串,而是分解 URL 路径”是什么意思?有什么区别?

以上是关于.htaccess : 带有任意数量+参数名称的漂亮 URL的主要内容,如果未能解决你的问题,请参考以下文章

具有任意数量参数的函数的 C# 记忆[关闭]

在mysql中连接任意数量的字符串行(分层查询)

带有可选参数的nginx和htaccess重写规则

htaccess重写规则,带有unicode字母的参数

如何使用 htaccess 将带有参数的旧 url 重定向到新的 seo url

带有编号参数名称的 Python argparse