.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)
m/
开头的条件
第二行和第三行是传入 URL 不代表实际文件或文件夹的条件(我们不希望我们不起眼的重写规则阻止我们访问真实资源)。
第四行是实际规则本身,它使用正则表达式语法来匹配和捕获出现在主机名之后的所有内容,并将其作为名为@987654327@ 的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的主要内容,如果未能解决你的问题,请参考以下文章