php - .htaccess 使用 php $_GET 缩短 URL

标签 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 并且不让它与预先存在的函数冲突来帮助我?

最佳答案

将此规则添加到重写配置文件 url 的 .htaccess block 中(在打开重写引擎之后):

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

该规则现在将仅用于 URL,例如: mydomain.com/m/(任意数字)

  • 第一行是传入的URL必须以m/开头的条件
  • 第二行和第三行是传入 URL 不代表实际文件或文件夹的条件(我们不希望我们简陋的重写规则阻止我们访问真实资源)。
  • 第四行是实际规则本身,它使用正则表达式语法来匹配和捕获出现在主机名之后的所有内容,并将其作为名为 的 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 的所有部分,用 /(斜杠)分隔符分隔。

URL 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]

关于您的陈述:

AND NONE OF IT CAN CHANGE

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

  • 关于
  • 常见问题

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

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

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

关于php - .htaccess 使用 php $_GET 缩短 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9649636/

相关文章:

php - 不能在同一个 Twig 文件中使用循环 2 次

Apache: "Header always set"和 "Header set"之间的区别?

regex - 如果 URL 的字符长度小于一定数量的字符,如何重写 URL

android - 在 Android map 图 block 的 getTileUrl 中添加授权 header

perl - 在 Perl 中如何找到所有重定向后的最终 URL?

php - 为什么事件记录模式不适用于丰富的领域模型?

php - ubuntu升级后xdebug不工作

php - elasticsearch-php多范围查询不起作用

apache - 控制服务器上自定义文件的缓存过期

javascript - 使用 JavaScript 获取规范 url