使用php $_GET 缩短URL的.htaccess

4

我需要缩短我的页面,从:

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) 

to

mydomain.com/(USERNAME)

有人能帮我缩短m/index.php?mixid的长度吗?而且不会与现有函数冲突吗?

2个回答

12

在打开重写引擎后,将此规则添加到您的 .htaccess 块以重写配置文件 URL:

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不代表实际的文件或文件夹(我们不希望我们谦卑的重写规则阻止我们使用真实资源)。
  • 第四行是实际的规则本身,它使用正则表达式语法匹配并捕获主机名后出现的所有内容,并将其作为名为id的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();

那么你现在拥有了$splitArr,其中包含使用斜杠/作为分隔符拆分的URL所有部分。

URLexample.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]

关于你的陈述:

AND NONE OF IT CAN CHANGE

我严重建议您考虑对第一条规则进行微小更改。将最终的URL设为mydomain.com/users/(用户名) (就像这里一样)。在这些情况下,更具体比过于笼统要好得多(如当前规则)。您是否考虑过如果有人选择了以下用户名可能会带来的混淆:

  • about
  • faq
  • home

尽管这些用户名是完全有效的,但这些用户的个人资料将会是:

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

这些用户名将阻止您可能想要保存在站点其他位置的重要URL。我认为很清楚为什么这些用户名是不受欢迎的。


非常感谢。原本这个答案也不起作用,但我删除了第一行,现在它完美运行!我无法感谢你,我已经连续几天都在努力让它工作! - Alex Sarnowski
1
其实第一行非常重要——你能试着不转义斜杠吗? - Lix
这两个函数都可以完美处理带有尾斜杠的情况。不带尾斜杠的情况不能正常工作吗? - Alex Sarnowski
我指的是你的评论和你的建议编辑。如果一切正常,我们应该删除这些评论 :) - Lix
1
@Lix,+1,除非您不需要转义/字符。这不是Perl或Javascript。/在apache regexps中不是特殊字符。 - TerryE
显示剩余2条评论

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

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


这与 OP 所要求的相反。 - Madbreaks
在我看來很不錯(但僅當它被添加到現有規則之前時,才不會引起衝突)。 - guido

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接