.htaccess 使用 php $_GET 缩短 URL

Posted

技术标签:

【中文标题】.htaccess 使用 php $_GET 缩短 URL【英文标题】:.htaccess shorten URL using php $_GET 【发布时间】:2012-03-27 19:45:51 【问题描述】:

我需要能够从以下位置缩短我的页面:

mydomain.com/mixtape.php?mixid=(WHATEVER NUMBER)

收件人:

mydomain.com/m/(WHATEVER NUMBER)

现在通常这对我来说不是什么大问题,但由于我的 .htaccess 文件中有一些预先存在的函数,这个函数很难不与其他函数进行不正确的交互。

下面是我的 .htaccess 文件的当前代码(并且都不能更改)

RewriteEngine on
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^([^/\.]+)/?$ profile.php?user=$1 [L]

以上,.htaccess 文件正在缩短我的

mydomain.com/profile.php?username=(USERNAME) 

mydomain.com/(USERNAME)

有没有人可以帮助我缩短 m/index.php?mixid 并且不让它与预先存在的功能冲突?

【问题讨论】:

【参考方案1】:

将此规则添加到您的 .htaccess 块重写配置文件网址(打开重写引擎后):

RewriteCond $1 ^m/
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^(.*)$ mix.php?id=$1 [L]

该规则现在将仅用于以下 URL: mydomain.com/m/(WHATEVER NUMBER)

第一行是传入的URL必须以m/开头的条件 第二行和第三行是传入 URL 不代表实际文件或文件夹的条件(我们不希望我们不起眼的重写规则阻止我们访问真实资源)。 第四行是实际规则本身,它使用正则表达式语法来匹配和捕获出现在主机名之后的所有内容,并将其作为名为@9​​87654327@ 的GET 参数传递给mixtape.php 文件。此行还包含 [L] 标志,该标志表明当前传入的 URL 将不再发生规则或重写。

在您的 mix.php 文件中,您可以使用 explode 方法将结果字符串拆分为一个数组:

http://example.com/m/foo/bar => `http://example.com/mixtape.php?id=/m/foo/bar

$splitArr = explode('/',$_GET['id']);

$splitArr =>
array (
  0 => 'm',
  1 => 'foo',
  1 => 'bar',
) 

并用

删除最初的m
array_shift();

然后,您将得到包含 URL 的所有部分的 $splitArr,并用 /(斜杠)分隔符分隔。

网址example.com/m/foo/bar 如下所示:

array (
  0 => 'foo',
  1 => 'bar',
) 

将此规则放在现有规则之前很重要,因为现有规则将作用于任何传入的 URL。您拥有的最后两条规则应如下所示:

RewriteEngine on
RewriteCond $1 ^m/
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^(.*)$ mix.php?id=$1 [L]

RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^([^/\.]+)/?$ profile.php?user=$1 [L]

关于你的陈述:

这一切都无法改变

我强烈建议您考虑对第一条规则进行小幅更改。使最终网址类似于mydomain.com/users/(USERNAME)(as they do here)。在这些情况下,更具体比过于笼统(如当前规则)要好得多。您是否考虑过如果有人选择用户名可能造成的混乱,例如:

关于 常见问题解答 首页

虽然这些用户配置文件是完全有效的用户名:

mydomain.com/about mydomain.com/faq mydomain.com/home

这些用户名会阻止您可能希望为网站上其他位置保存的重要 URL。我认为很清楚为什么这些用户名不受欢迎。

【讨论】:

对不起 - 我改变了答案。没完全看懂帖子:) 非常感谢。最初这个答案也不起作用,但我删除了第一行,它就像一个魅力!我非常感谢你,我一直在努力让这个工作好几天! 非常欢迎你,我的朋友!乐意效劳!传播.htaccess爱! 其实第一行很重要——你会在不转义斜杠的情况下尝试吗? @Lix,+1,除非您不需要转义 / 字符。这不是 Perl 或 javascript。 / 不是 apache 正则表达式中的特殊字符。【参考方案2】:
RewriteRule ^m/([0-9]+)$ /mixtape.php?mixid=$1

在现有规则之前或之后放入。不应引起任何冲突。

【讨论】:

这与操作要求的相反 对我来说看起来不错(但只有添加到现有规则之前才不会引起冲突)

以上是关于.htaccess 使用 php $_GET 缩短 URL的主要内容,如果未能解决你的问题,请参考以下文章

在 $_GET 中使用转义 & 符号的 htaccess 重写规则失败

htaccess 和 css 文件

htaccess mod 用斜杠将 $_GET 重写为变量

Kohana、.htaccess 和 $_GET

htaccess 实现网址缩短

如何使用 .htaccess 重写 URL 而不会影响 $GET 数据