.htaccess使用php $ _GET缩短网址

时间:2012-03-10 19:49:16

标签: php .htaccess url

我需要能够缩短我的页面:

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来帮助我,而不是让它与预先存在的函数冲突?

2 个答案:

答案 0 :(得分:12)

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

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

该规则现在仅用于URLS,例如: mydomain.com/m/(WHATEVER NUMBER)

  • 第一行是传入网址必须以m/
  • 开头的条件
  • 第二行和第三行是传入URL不代表实际文件或文件夹的条件(我们不希望我们简陋的重写规则阻止我们使用真实资源)。
  • 第四行是实际规则本身使用正则表达式语法来匹配和捕获主机名后出现的所有内容,并将其作为名为mixtape.php的GET参数传递给id文件。此行还包含[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();

然后,您将留下$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

这些用户名将阻止您可能希望为网站上的其他位置保存的重要网址。我认为很明显为什么这些用户名是不受欢迎的。

答案 1 :(得分:-2)

RewriteRule ^m/([0-9]+)$ /mixtape.php?mixid=$1

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