【问题标题】:Rewriting urls back and forth using mod_rewrite使用 mod_rewrite 来回重写 url
【发布时间】:2013-01-12 17:15:36
【问题描述】:

也许这似乎是一个非常简单的问题,我网站的网址写得很糟糕,所以我想重写它们。所以我准备激活mod_rewrite。问题如下:

假设我的url从site_url/index.php?page=mypage&type=mytype切换到site_url/mypage/mytype,如果刷新页面会发生什么,是否需要将相反的过程放入.htaccess文件进行重写?

【问题讨论】:

  • 你想怎么重写?来自浏览器的 URL 是什么?它在内部应该是什么样子?
  • @OlafDietsche 我希望这个 url site_url.index.php?page=mypage&type=mytype 显示为 site_url/mypage/mytype,所以我想知道当我刷新页面 site_url/ 时发生了什么mypage/mytype,以及当我使用我的代码路由不支持的相同 url 发出 get 请求时会发生什么
  • URL 从不从site_url/index.php?page=mypage&type=mytype“切换”到site_url/mypage/mytype,反之亦然,我认为这就是造成混乱的原因。第一步是在浏览器的地址栏中输入site_url/mypage/mytype。它是始终显示的 URL,其路径甚至不必存在。下一步是使用 mod_rewrite 指令捕获该请求,以静默地将其映射到现有资源(如 PHP 文件)。此操作是隐藏的,由“漂亮”的 URL 触发,而不是相反。

标签: php apache .htaccess mod-rewrite url-rewriting


【解决方案1】:

您需要结合使用重定向和重写。 URL 重写过程的大纲草案将是:

  • 如果 URL 包含 .php,301/302 会将请求重定向到其 SEO 友好版本。这将更改浏览器地址栏中的地址。
  • 如果请求了对 SEO 友好的 URL,请将其重写为其 PHP 版本。这不会改变浏览器地址栏中的地址。

这里是一个非常基本的例子,上面的重写规则可以做到以上两个:

#
# redirect /index.php?page=somepage&type=sometype to friendly url
# 
RewriteCond %{THE_REQUEST} /index\.php
RewriteCond %{QUERY_STRING} page=(\w+)&type=(\w+)
RewriteRule ^index\.php$ /%1/%2? [R,L]

#
# rewrite /somepage/sometype to index.php
# 
RewriteRule ^(\w+)/(\w+)$ index.php?page=$1&type=$2

【讨论】:

    【解决方案2】:

    在 .htaccess 中,您应该进行映射...

    ^/(mypage)/(mytype) to index.php?page=$1&type=$2
    

    但是应该不理会相反的情况。因此,对site_url/index.php?page=mypage&type=mytype 的直接请求将按原样传递。

    所以,刷新不会改变任何东西。

    【讨论】:

    • 事实上我的问题是当我刷新页面 site_url/mypage/mytype 时发生了什么,以及当我使用我的代码路由不支持的相同 url 发出 get 请求时发生了什么
    • @user1611830,“代码的路由”是什么意思?重定向?重写?需要特异性。此外,刷新与新的 get 请求没有什么不同,只是浏览器不会对某些附加项使用缓存。
    猜你喜欢
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    相关资源
    最近更新 更多