我需要能够缩短我的页面:
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/