【问题标题】:URL Rewrite HTACCESS GETURL 重写 HTACCESS GET
【发布时间】:2016-02-18 19:33:10
【问题描述】:

目前我正在使用

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^\.]+)$ $1.php [NC,L]

例如将http://localhost/products.php 重写为http://localhost/products

我将如何添加以便它还将http://localhost/products.php?category=all 重写为http://localhost/products/all/

我并没有完全理解代码。谢谢!

【问题讨论】:

  • 你在向后看。您不会将丑陋的 url 改写成漂亮的。您的代码应该将漂亮的代码发送给客户端,例如<a href="/products/all/">,然后将它们转换回丑陋的内部使用。 modwrite 只处理传入的 url。它不会翻译 OUTGOING 的。
  • 是的,这是有道理的,谢谢。尽管我相当确定我当前的 htaccess 代码已经做到了这一点吗?我只是理解它做错了什么?
  • 你应该有rewriterule ^/(.*)/(.*)$ $1.php?category=$2 或类似的地方。

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


【解决方案1】:

您可以使用这些规则添加另一个带有查询字符串的 url,以重定向到 SEO 友好的 URL。还有一些额外的规则来防止使用旧的 URL 样式。

RewriteEngine On

#redirect old url to pretty url
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\ /+(.+)\.php\?category=([^&\s]+)
RewriteRule ^ /%1/%2? [R=301,L]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\ /+(.+)\.php
RewriteRule ^ /%1? [R=301,L]

#if request is for a real file or real directory do nothing.
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

#internally redirect uri to php
RewriteRule ^([^/]+)/([^/]+)/?$ $1.php?category=$2 [NC,L]
RewriteRule ^([^\.]+)/?$ $1.php [NC,L]

【讨论】:

  • 这看起来很棒,谢谢,正是我想要的,但是当我尝试它并链接到 localhost/products/all 时,它似乎并没有转到 localhost/products.php?category=all 否则其余的工作,大加让 cmets 解释它的作用
  • 似乎 RewriteRule ^([^/]+)/([^\.]+)/?$ $1.php?collection=$2 [NC,L] 是罪魁祸首,重定向旧如果您尝试访问 localhost/products.php?category=all,那么漂亮的 url 部分实际上指向 localhost/products/all,但是一旦您到达那里,该文件就不存在了,所以它似乎实际上并没有访问 products.php 或其他可能出错的地方,有什么建议吗?谢谢..进一步检查它似乎试图访问/products.php.php
  • 这是什么时候发生的/products.php.php?使用漂亮的网址?
  • 是的,仅当访问 localhost/products/all 而不是 localhost/products 时,还有一些奇怪的地方,如果我完全删除我的 htaccess 代码,它仍然将 localhost/products 指向 localhost/products.php 并且可以正常工作,非常混乱
  • 我稍微修改了第二次到最后一次重写的代码。试试看。首先清除浏览器缓存或使用其他浏览器。这可能会导致奇怪。
【解决方案2】:

.htaccess

<IfModule mod_rewrite.c>
RewriteEngine On
#RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . 1.php [L]
</IfModule>

创建文件 1.php

#split the path by '/'
  $params     = split("/", $_SERVER['REQUEST_URI']);
    define("FILE_PHP",".php");
    define("ERROR_404","404.php");
    define("INCLUDE_ADMIN","index.php");
    class Loader{

     public function __autoload($params) {
         if(isset($params[1])==TRUE){ 
          if (file_exists($params[1].FILE_PHP)) { 
             if(is_set($params[2])==true)
              $category=$params[2];
              require_once $params[1].FILE_PHP; 
              return true; 
          } 
           require_once ERROR_404; 
          return false; 
         }else{
          require_once INCLUDE_ADMIN; 
          return TRUE; 
         }
    } 
    }
    $loader=new Loader();
    $loader->__autoload ($params);

【讨论】:

    猜你喜欢
    • 2014-05-16
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    相关资源
    最近更新 更多