【问题标题】:how to rewrite a url with two variables using .htaccess如何使用 .htaccess 重写带有两个变量的 url
【发布时间】:2012-08-21 14:29:28
【问题描述】:

我想用 .htaccess 重写它我有这个网址:

../index.php?page=details&id=123456

像这样:

../detail/123456

但我真的不知道该怎么做。你能帮我重写这个网址吗? 或者给我一个简单的例子,我可以理解它是如何工作的

【问题讨论】:

  • 是 .. 基本 url 还是其他目录?

标签: php .htaccess url-rewriting


【解决方案1】:
RewriteRule ^(.*)/([0-9]+)$ index.php?page=$1&id=$2&%{QUERY_STRING}

第一个 (.*) 选择任何字符串,例如“细节”。 ([0-9]+) 捕获一个数字,在您的情况下为“123456”

终于

&%{QUERY_STRING} 

确保将其他参数也添加到您的后端脚本中。

【讨论】:

  • 如果您需要两个字母数字字符串,而不仅仅是数字,您可以再次将([0-9]+) 替换为(.*)
  • 这不是 OP 想要的相反方向吗?在我看来,您正在从“整洁”风格转变为查询字符串风格,我认为他想要相反。
  • @tobis 我们不应该使用<IfModule mod_rewrite.c> 还是没有必要?
  • 如果您使用的是 .htaccess 文件,我认为没有必要。就我而言,没有它也可以工作;o)
  • @Saurabh 只有在不知道 mod_rewrite 模块是否存在时才需要它。如果模块不存在,它会给出服务器错误,这可能更可取(例如,提醒您将模块包含在 apache 中)。
【解决方案2】:

这应该可行:

RewriteEngine On
RewriteRule ^detail/([^/]*)$ /index.php?page=details&id=$1 [L]

【讨论】:

    【解决方案3】:

    这是我在子目录中用于网页的示例。

    # "learn/degree/index.php?d=mathematics" shows as "learn/degree/mathematics"
    RewriteRule ^learn/degree/([a-zA-Z_-]+)$ learn/degree/index.php?d=$1
    

    要完成它,请记住在页面开头写下:

    RewriteBase /
    RewriteEngine On
    

    这是我在我的页面中使用的“完整”.htaccess 来给你一些想法。

    #Redirect any www. to the page without it. Helps to keep user logged.
    RewriteBase /
    RewriteEngine On
    rewriteCond %{HTTP_HOST} ^www.newfutureuniversity.org [NC]
    rewriteRule ^(.*)$ http://newfutureuniversity.org/$1 [R=301,L]
    
    Options +Indexes
    Options +FollowSymlinks
    
    # Finally working. Rewrite the user so "/student/Username" will internally be "/student/?user=Username"
    RewriteRule ^student/([a-zA-Z0-9_-]+)$ student/index.php?user=$1
    
    # Rewrite the disciplines so "learn/degree/1" will internally be "learn/degree/index.php?dis=1"
    RewriteRule ^learn/degree/([1-4])$ learn/degree/index.php?dis=$1
    
    # Rewrite the degrees so "learn/degree/mathematics" will internally be "learn/degree/index.php?d=mathematics"
    RewriteRule ^learn/degree/([a-zA-Z_-]+)$ learn/degree/index.php?d=$1
    
    # Rewrite the degrees so "learn/subject/2/5/7" will internally be "learn/subject/index.php?class=2&div=5&section=7"
    RewriteRule ^learn/subject/([0-9])$ learn/subject/index.php?class=$1
    RewriteRule ^learn/subject/([0-9])/([0-9])$ learn/subject/index.php?class=$1&div=$2
    RewriteRule ^learn/subject/([0-9])/([0-9])/([0-9])$ learn/subject/index.php?class=$1&div=$2&section=$3
    

    您必须创建指向../detail/123456 的链接,然后脚本在内部将其解释为../index.php?page=details&id=123456。如果你不想要这个,那么你正在寻找一个重定向。

    【讨论】:

    • 这仅适用于一个变量。 OP 专门询问 2 个变量。
    • @ThomasClayson,好吧,我把我的代码放了,这样他就可以看得更清楚了。从 OP 那里,我想给他一些关于它是如何工作的想法,这样他就可以自己解决了。
    • 酷,很好。我试图删除我的反对票,但它没有显示为已编辑,这很奇怪,因此我无法删除它。对不起。
    • 别担心,我介意我的回答有点用处,而不是关于选票和积分 (;
    • 嘘……谎言!我已经投票给你另一个很好的答案来补偿你。 ;-) 希望可以!投票很重要,因为它有助于将人们引导到最佳答案,而您的答案现在非常有用,因此将来到这里的人引导离开它是一种耻辱。
    【解决方案4】:

    试试这个

    <IfModule mod_rewrite.c>
        RewriteEngine on
        Options +FollowSymlinks
        # RewriteBase / add this if necessery, commented intentionally
        RewriteRule ^detail/([0-9]+)$ index.php?page=details&id=$2
    
    </IfModule>
    

    【讨论】:

    • 这可行,但您必须为每个 page... 添加一个新规则,这是低效的。
    • 当然,但是看起来他想将 /detail 页面指向 page=details 参数第一个参数不等于我认为的页面名称?
    • 首先他在问题标题中声明他正在寻找一种方法来路由 2 个变量,这让我认为“详细信息”位也是一个变量。
    • 另一方面,在他的 php 代码中修改字符串并不难,因此更通用的规则将在未来提供一些灵活性。我们还可以创建捕获所有规则并通过斜杠或其他任意字符串(如用于路由类的 php 框架中使用的其他任意字符串)
    猜你喜欢
    • 2017-10-01
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    相关资源
    最近更新 更多