【问题标题】:Dynamic Mod_Rewrite for unique auto generated linksDynamic Mod_Rewrite 用于独特的自动生成链接
【发布时间】:2015-02-20 09:07:57
【问题描述】:

我想知道这是否可能 -

我想使用 htaccess 来简化我网站的链接,因为一些用户抱怨它们看起来像“垃圾邮件”——它们目前很长。

我知道我可以按照这些思路使用一些东西 -

website.com/subfolder/index.php/123456 转为website.com/123456

RewriteRule ^/123456$ /subfolder/index.php/123456

但是我的问题在于这些链接需要是动态的。我试过查找这个,但我读到的其他类似问题是关于使动态 php 链接美化并给出具体答案。


这是我目前所拥有的:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteRule ^(.*)/$ /subfolder/index.php/$1 [NC,L,QSA]

在http://htaccess.madewithlove.be(顺便说一句真的很好的网站)上测试这个,输入网址http://website.com/id/123456给出http://website.com/subfolder/index.php/id/123456 - 如果我能找到一种方法从那个链接中删除/id/,那就太好了

【问题讨论】:

    标签: php .htaccess mod-rewrite


    【解决方案1】:

    要支持/123456 和/id/123456,您可以使用:

    Options +FollowSymLinks
    RewriteEngine On
    RewriteBase /
    
    RewriteRule ^(?:[^/]+/)?(\d{6})/?$ subfolder/index.php/$1 [L]
    

    它将两个 URI 都转发到 /subfolder/index.php/123456

    由于在上面的模式中使用了/d{6}/?$,它只会匹配以下URI:

    /123456
    /123456/
    /id/123456
    /foobar/123456
    

    参考资料:

    【讨论】:

    • 完美我的朋友,我有一个问题,你的规则是否也会重写诸如'website.com/guide/'或'website.com/downloadlink.app/'之类的url?
    • 如果它重写那些 url,只使用website.com/id/123456 是可以接受的,但使用website.com/123456 更可取
    • 那些我不想重写的链接 - 动态链接将始终是 6 位数字。我会接受你的答案作为正确答案,因为 RewriteRule 工作得很好,但我可以请你解释一下你的答案,因为我不希望只是“复制/粘贴”工作解决方案而不理解它:) 你的规则是否有一些检查该模式?你说它不会重写像website.com/downloadlink.app这样的url 它是如何区分这些url的
    • 我在回答中添加了解释和示例,希望它能澄清。
    • 太棒了,谢谢 :) +1 并接受。我发现很难在互联网上找到一篇正确解释模式标志的文章,例如 ^$?/$ 等,所以谢谢你的解释
    【解决方案2】:

    我这样做的方式,我不确定这是不是最佳方式,是在子文件夹中有一个 .htaccess,让我们假设 '/news',有点像这样:

    Options +FollowSymLinks
    RewriteEngine On
    RewriteBase /
    RewriteRule ^(.*)$ /news.html?Path=$1 [NC,L,QSA]
    

    现在“/news”中的任何请求都将被重定向到“/news.html”,并以 url 作为参数,但访问者只会看到第一个。所以,假设访问者要求:

    http://www.domain.com/news/happy_story.html

    这将在内部变为:

    http://www.domain.com/news.html?Path=/news/happy_story.html

    然后,您可以在此 HTML 页面中使用 Path 参数来确定要显示的内容。您可以将多个子文件夹用于不同的事情。

    再说一次,我不知道这是不是官方的做法,但它对我有用。

    如果有很多选项,您可能会希望使用编号系统。这样的数字可以引用您数据库中的索引。

    由于第一个 URL 并不真正指向页面,因此其中很大一部分可能是您想要的任何内容。假设您为新闻站点编号,并使用如下 URL:

    http://www.domain.com/news/265/The_day_that_the_happy_news_was_annouced

    在后台您只查找 URL 中的数字,而忽略其余部分。因此,只要数字正确,就会显示正确的页面。此 URL 将给出相同的结果:

    http://www.domain.com/news/265/Happy_story_day

    等等。

    【讨论】:

    • 如果您可以使用$1 作为变量,是否会使用类似:RewriteRule ^(.*)$ /subfolder/index.php/$1 [NC,L,QSA] 不适用于根文件夹中的 htaccess?
    • 根文件夹中 .htaccess 的问题是它会重写你所有的 URL。如果这就是你想要的,那很好。你必须阅读重写规则,看看什么是可能的,什么是不可能的。我的意思是,您不需要为每个页面都设置重写规则。
    • 嗯,如果我使用链接 website.com/id/123456.. 然后我可以在 id 子文件夹中使用 htaccess.. 检查我的问题,我会用一些“几乎可以工作”来更新它' 对我来说可以接受的规则:)
    • 太接近了,只需要找到一种方法从最终链接中删除 /id/ !
    【解决方案3】:

    KIKO 的回答很好,只要您公开的 URL 包含文档路径的一部分或某些数据库 ID。

    如果您不想这样做,请创建一个“中心”页面(就像那些 URL 缩短器一样),您可以在其中查找数据库中的一些短 URL 并在 PHP 中进行重定向。

    假设您创建了一篇标题为“一些快乐的故事!其中包含一些 über crap/garbage chars”的新闻文章,您清理字符串,将其与您的真实文章 URL 一起存储在某个数据库中:

    | short_url                              | long_url                                   |
    | "some_happy_story_with_some_uber_crap" | "http://website.com/news/article.php/1234" |
    

    这样你也可以有几个指向同一篇文章的短网址(例如,从“官方”网址中去除一些停用词)。

    在 hub.php(也可以被一些 RewriteRule 覆盖)中,你

    SELECT long_url FROM urls WHERE short_url='<script_path>'
    

    或类似的,并发出一个

    header("Redirect: ".$long_url); exit;
    

    【讨论】:

    • 请检查我更新的问题 - 我有理由相信我可以实现这一目标而无需诉诸 PHP 重定向
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多