Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重定向/.htaccess以将旧的PHP参数URL更改为SEO友好的CakePHP URL?_Php_Cakephp_Mod Rewrite_Seo - Fatal编程技术网

重定向/.htaccess以将旧的PHP参数URL更改为SEO友好的CakePHP URL?

重定向/.htaccess以将旧的PHP参数URL更改为SEO友好的CakePHP URL?,php,cakephp,mod-rewrite,seo,Php,Cakephp,Mod Rewrite,Seo,我将更新我的站点,使用CakePHP,而不是一个旧的自制框架。我需要编写HTAccess文件将旧的PHP参数URL重定向到新的CakePHP SEO友好URL,但我无法让它工作 我的htacess文件(app/webroot中的文件)目前看起来如下所示: RewriteEngine On RewriteRule ^index.php?action=view&item=172$ index.php?url=item/172 [R=301,L] RewriteCond %{REQUEST

我将更新我的站点,使用CakePHP,而不是一个旧的自制框架。我需要编写HTAccess文件将旧的PHP参数URL重定向到新的CakePHP SEO友好URL,但我无法让它工作

我的htacess文件(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结束,如果我查看$\u SERVER['REQUEST\u URI'],它将保持不变。虽然我不知道修改是否会改变这一点。我的重写规则似乎没有激活,即使它是直接从浏览器的URL栏复制的。我用out和out一个前导的
/
进行了尝试。没有骰子

这是怎么回事

我如何编写更通用的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汇集到正确形成的蛋糕url中。然后蛋糕的处理器会拿起并以某种方式处理。我不确定它怎么会错过Cake的第二条重写规则,但确实如此。试一试:

RewriteRule ^(.*)$ item/172 [R=301]
返回格式不正确的重定向,就像在上一个重定向上指定最后一个重定向一样:

RewriteRule ^(.*)$ /index.php?url=item/172 [R=301,L]
这表明它永远不可能完成

所以我其实很困惑,为什么这一次:

RewriteRule ^(.*)$ /index.php?url=item/172 [R=301]
返回正确的蛋糕url,但它会返回,并被发送到正确的页面。然而, 一旦我尝试更改第一部分,它就开始失败

等一下。当它点击
时,它开始失败。它成功地匹配了
index.php
,但没有匹配
index.php?
,但转义它没有什么区别

RewriteRule ^index.php\?$ /index.php?url=item/172 [R=301]
无法匹配或返回正确的URL。而且它似乎也不符合Cake的一般通吃,因为
$\u GET['url']
是空的。如何在mod_rewrite中转义参数字符以进行字面匹配?

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

模式最初将与URL中主机名和端口之后、查询字符串之前的部分相匹配。如果希望匹配主机名、端口或查询字符串,请分别使用
%{HTTP\u HOST}
%{SERVER\u port}
%{query\u string}
变量使用
重写cond

因此:

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

模式最初将与URL中主机名和端口之后、查询字符串之前的部分相匹配。如果希望匹配主机名、端口或查询字符串,请分别使用
%{HTTP\u HOST}
%{SERVER\u port}
%{query\u string}
变量使用
重写cond

因此:


啊!mod rewrite的*&@$&有什么问题?我让它工作了大约30秒,添加了另一个重写规则,它又停止工作了!我删除了另一条重写规则,但它仍然不起作用!到底是什么?!啊!mod rewrite的*&@$&有什么问题?我让它工作了大约30秒,添加了另一个重写规则,它又停止工作了!我删除了另一条重写规则,但它仍然不起作用!到底是什么?!非常感谢。成功了。不知何故,在我所有的阅读和搜索中,这一点从未被提及或提及。我从来没有想到查询字符串会与主URL分开。谢谢!成功了。不知何故,在我所有的阅读和搜索中,这一点从未被提及或提及。我从来没有想到查询字符串会与主URL分离。
RewriteCond %{QUERY_STRING} ^action=view&item=([0-9]+)$
RewriteRule ^index\.php$ /index.php?url=item/%1 [R=301,L]