.htaccess使用php $ _GET缩短网址

Ale*_*ski 4 php url .htaccess

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

mydomain.com/mixtape.php?mixid=(WHATEVER NUMBER)
Run Code Online (Sandbox Code Playgroud)

至:

mydomain.com/m/(WHATEVER NUMBER)
Run Code Online (Sandbox Code Playgroud)

现在通常这对我来说并不是一个问题,但由于我的.htaccess文件中存在一些预先存在的函数,因此该函数很难不与其他函数进行不正确的交互.

下面是我的.htaccess文件的当前代码(没有它可以改变)

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/\.]+)/?$ profile.php?user=$1 [L]
Run Code Online (Sandbox Code Playgroud)

上面,.htaccess文件正在缩短我的

mydomain.com/profile.php?username=(USERNAME) 
Run Code Online (Sandbox Code Playgroud)

mydomain.com/(USERNAME)
Run Code Online (Sandbox Code Playgroud)

有没有人可以通过缩短m/index.php?mixid来帮助我,而不是让它与预先存在的函数冲突?

Lix*_*Lix 12

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

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

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

  • 第一行是传入URL必须以条件开头的条件 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']);
Run Code Online (Sandbox Code Playgroud)

$splitArr =>
array (
  0 => 'm',
  1 => 'foo',
  1 => 'bar',
) 
Run Code Online (Sandbox Code Playgroud)

和删除初始m

array_shift();
Run Code Online (Sandbox Code Playgroud)

然后,您将保留$splitArr包含URL的所有部分,并使用/(斜杠)分隔符进行拆分.

URL example.com/m/foo/bar看起来像:

array (
  0 => 'foo',
  1 => 'bar',
) 
Run Code Online (Sandbox Code Playgroud)

将此规则放在现有规则之前非常重要,因为现有规则将对任何传入的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]
Run Code Online (Sandbox Code Playgroud)

关于你的陈述:

没有它可以改变

我会认真地建议您考虑对第一条规则进行一些小改动.制作最终的网址mydomain.com/users/(USERNAME) (就像他们在这里一样).在这些情况下,更具体而不是过于笼统(如现行规则).如果有人要选择用户名,您是否考虑过可能产生的混淆:

  • 关于
  • 常问问题

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

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

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