【问题标题】:.htaccess Url Rewrite Remove Query-String Keys.htaccess Url 重写删除查询字符串键
【发布时间】:2012-09-15 03:23:33
【问题描述】:

我有一组网址,例如...

www.example.com/page/1/name/abc
www.example.com/city/la/name/abc
www.example.com/page/1/name/abc/city/la
www.example.com/page/1/

并希望将它们转换为..

www.example.com/1/abc
www.example.com/la/abc
www.example.com/1/abc/la
www.example.com/1/

基本上我想隐藏查询字符串中的键。

如何做到这一点?有什么帮助吗?

编辑

每个页面都有不同的键,每页大约有 25 个键。

【问题讨论】:

  • 这有点不清楚。问题是您的控制器重定向来自看起来像第一组 URL 的控制器,并且希望浏览器只显示第二个 URL 列表吗?如果是这样,您是否有任何理由不想使用 Apache 和 mod_rewrite 来执行此操作?
  • 是的,你做对了。我并没有说我不想用 Apache 和 mod_rewrite 来做这个。
  • 从您的示例 URL 中这几乎是不可能的,您怎么知道什么值来自什么键?如果您删除密钥,它们就消失了。你需要一个模式来再次解析每个值
  • @martin.. 有没有可能?
  • 我自己没有测试过,但我认为下面的@mabarroso 有正确的起点......我认为您应该更改问题以明确您正在寻找重写的解决方案URL,而不仅仅是在后端解释它们。

标签: php .htaccess zend-framework url-rewriting


【解决方案1】:

您可以使用Zend_Controller_Router_Route 和/或Zend_Controller_Router_Route_Regex 并定义路由

$route = new Zend_Controller_Router_Route(
    ':key/:city_name',
    array(
        'controller' => 'somecontroller',
        'action'     => 'pageAction'
    ),
    array('key' => '^\d+$')
);
$router->addRoute('page', $route); // www.example.com/1/abc

$route = new Zend_Controller_Router_Route(
    ':key/:city_name',
    array(
        'controller' => 'somecontroller',
        'action'     => 'cityAction'
    ),
    array('key' => '^\d+\w+$') // www.example.com/1a/abc
);
$router->addRoute('city', $route);

【讨论】:

  • 除非我弄错了,否则这并不能解决他的问题,即他想先真正重写 URL……但这将提供解释重写 URL 的解决方案。
【解决方案2】:

前端控制器是一种通过单点映射 uri 的设计模式,Zend 使用前端控制器模式。此映射可以在 bootstrap.php 中更改。我搜索了一下,发现this question 非常相似。

【讨论】:

    【解决方案3】:

    我会保留默认的.htaccess,它将所有请求(除了img、css、js 等前端资源除外)路由到index.php。然后在引导程序中添加routes 来处理您的重定向。

    对于您想要更改为新网址的现有网址,我将创建一个 RedirectController,其中包含重定向的操作 - 真正重定向,使用 HTTP 301 代码,而不仅仅是执行相同的操作 - 到您想要的网址。

    有一个有效的论点反对通过路由在应用程序级别实现重定向而不是处理它.htaccess:它的性能会降低,因为需要整个引导/调度周期才能实现重定向。这是一个公平的论点,但我发现将我的所有路由信息放在一个地方更清楚,而不是分开.htaccess 和我的应用级路由。

    【讨论】:

      【解决方案4】:

      试试这个

      <IfModule mod_rewrite.c>
          RewriteEngine on
      
          #1 www.example.com/1/abc to www.example.com/page/1/name/abc (/number/string)
          RewriteRule ^([0-9]+)/([^/]+)$ /page/$1/name/$2 [L,QSA]
      
          #2 www.example.com/la/abc to www.example.com/city/la/name/abc (/string/string)
          RewriteRule ^([^/]+)/([^/]+)$ /city/$1/name/$2 [L,QSA]
      
          #3 www.example.com/1/abc/la to www.example.com/page/1/name/abc/city/la (/number/string/string)
          RewriteRule ^([0-9]+)/([^/]+)/([^/]+)$ /page/$1/name/$2/city/$3 [L,QSA]
      
          #4 www.example.com/1/ to www.example.com/page/1/ (/number/)
          RewriteRule ^([0-9]+)/$ /page/$1/ [L,QSA]
      </IfModule>
      

      规则顺序非常重要。不要换。规则 1 必须始终在规则 2 之前。规则 4 必须始终在最后。顺序是从最具体到最通用的规则。规则 3 可以在任何位置,但在规则 4 之前。

      【讨论】:

        【解决方案5】:
        1. 尝试统一您的网址。然后它会更容易使用。 这是一个实际的例子。

        .htaccess 文件:

        RewriteEngine on
        
        # Remove trailing '/' from URL
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d 
        RewriteCond %{REQUEST_URI} ^(.+[^/])/$
        RewriteRule ^(.*)/$ /$1 [R=301,L]
        
        # Convert url to ?q=/US/en/0001
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d 
        RewriteCond %{REQUEST_URI} ^(.*)$
        RewriteRule ^(.*)$ index.php?q=%1 [NS,L]
        
        # Input: /US/en/0001
        # Output print_r($_GET);
        # Array
        # (
        #    [country] => US
        #    [locale] => en
        #    [pid] => 0001
        # )
        RewriteCond %{QUERY_STRING} ^q=/([A-Z]{2})/([a-z]{2})/([0-9a-zA-Z]{4})$
        RewriteRule ^(.*)$ ?country=%1&locale=%2&pid=%3 [NS,L]
        
        # Input: /US/en
        # Output print_r($_GET);
        # Array
        # (
        #    [country] => US
        #    [locale] => en
        # )
        RewriteCond %{QUERY_STRING} ^q=/([A-Z]{2})/([a-z]{2})$
        RewriteRule ^(.*)$ ?country=%1&locale=%2 [NS,L]
        
        # Input: /US
        # Output print_r($_GET);
        # Array
        # (
        #    [country] => US
        # )
        RewriteCond %{QUERY_STRING} ^q=/([A-Z]{2})$
        RewriteRule ^(.*)$ ?country=%1 [NS,L]
        

        index.php

        <?php
            print_r($_GET);
        ?>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-11-15
          • 1970-01-01
          • 2023-03-04
          • 2012-06-16
          • 2012-09-19
          • 1970-01-01
          • 2012-10-11
          相关资源
          最近更新 更多