【问题标题】:.htaccess shorten URL using php $_GET.htaccess 使用 php $_GET 缩短 URL
【发布时间】:2012-03-27 19:45:51
【问题描述】:

我需要能够从以下位置缩短我的页面:

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 并且不让它与预先存在的功能冲突?

【问题讨论】:

    标签: php .htaccess url


    【解决方案1】:

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

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

    然后,您将得到包含 URL 的所有部分的 $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

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

    【讨论】:

    • 对不起 - 我改变了答案。没完全看懂帖子:)
    • 非常感谢。最初这个答案也不起作用,但我删除了第一行,它就像一个魅力!我非常感谢你,我一直在努力让这个工作好几天!
    • 非常欢迎你,我的朋友!乐意效劳!传播.htaccess爱!
    • 其实第一行很重要——你会在不转义斜杠的情况下尝试吗?
    • @Lix,+1,除非您不需要转义 / 字符。这不是 Perl 或 Javascript。 / 不是 apache 正则表达式中的特殊字符。
    【解决方案2】:
    RewriteRule ^m/([0-9]+)$ /mixtape.php?mixid=$1
    

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

    【讨论】:

    • 这与操作要求的相反
    • 对我来说看起来不错(但只有添加到现有规则之前才不会引起冲突)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 2015-09-10
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多