代码之家  ›  专栏  ›  技术社区  ›  Daniel Bingham

重定向/.htaccess以将旧的php参数URL更改为对seo友好的cakephp URL?

  •  0
  • Daniel Bingham  · 技术社区  · 15 年前

    我将要更新我的站点以使用cakephp,而不是使用国产的旧框架。我需要编写htaccess文件来将旧的php参数url重定向到新的cakephp seo友好的url,但是我不能让它工作。

    我的htaces文件(app/webroot中的文件)目前看起来如下:

    RewriteEngine On
    
    RewriteRule ^index.php?action=view&item=172$ index.php?url=item/172 [R=301,L]
    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
    

    它不起作用。我试着移除L,只是把它重定向到项目/172,但也没用。当前的一个以url参数unset结束,如果我在$_server['request_uri']中查找,它是不变的。尽管我不知道国防部重写是否会改变这一点。我的重写规则似乎没有激活,即使它是直接从我的浏览器的URL栏复制的。我试过了,但没有领先。 / . 没有骰子。

    这是怎么回事?

    如何编写更通用的URL来进行转换?我尝试了如下方法:

    RewriteRule ^index.php?action=view&item=([0-9]+)$ index.php?url=items/$1 [R=301,L]    
    

    但这也不管用。我做错什么了?

    编辑 这真让人恼火。

    RewriteRule ^(.*)$ /index.php?url=item/172 [R=301]
    

    那就行了。它将所有URL导入到正确形成的cake URL中。然后哪个蛋糕的处理器会拿起并处理。我不知道它怎么会错过蛋糕的第二条重写规则,但它确实错过了。尝试此操作:

    RewriteRule ^(.*)$ item/172 [R=301]
    

    返回格式错误的重定向,与在前一个重定向上指定最后一个重定向一样:

    RewriteRule ^(.*)$ /index.php?url=item/172 [R=301,L]
    

    这说明它永远无法完成。

    所以我真的很困惑为什么这一个:

    rewriterule^(.*)$/index.php?url=item/172[r=301]
    

    返回正确的cake url,但它会返回并发送到正确的页面。然而, 一旦我试图改变第一部分,它就开始失败。

    等一下。当它击中 ? 它开始失败。它成功匹配 index.php 但不是 index.php? 但逃走没有什么区别。

    RewriteRule ^index.php\?$ /index.php?url=item/172 [R=301]
    

    无法匹配或返回正确的URL。而且它似乎也不符合蛋糕的正常捕获方式,因为 $_GET['url'] 是空的。如何在mod重写中转义参数字符以匹配字面?

    1 回复  |  直到 15 年前
        1
  •  4
  •   Gumbo    15 年前

    用 RewriteRule 只能测试URI路径,而不能测试查询:

    这个 图案 最初将与URL中主机名和端口之后、查询字符串之前的部分匹配。如果要与主机名、端口或查询字符串匹配,请使用 RewriteCond 与 %{HTTP_HOST} , %{SERVER_PORT} ,或者 %{QUERY_STRING} 变量。

    所以:

    RewriteCond %{QUERY_STRING} ^action=view&item=([0-9]+)$
    RewriteRule ^index\.php$ /index.php?url=item/%1 [R=301,L]