我现在有User SEO URL's
在Opencart的管理员设置为YES。
System -> Settings -> Store -> Server -> User SEO URL's
到目前为止,所有的标签和SEO链接工作; 命令做了期望的效果。
然而,对于网页和其他几个环节; 如何删除:
的index.php?路径=普通/家庭
从URL? 我必须从字面上做一个查找和替换硬编码的PHP文件和风险升级或有另一种方式?
(无腹胀性能即没有差的业余工具,如vQmod)
我现在有User SEO URL's
在Opencart的管理员设置为YES。
System -> Settings -> Store -> Server -> User SEO URL's
到目前为止,所有的标签和SEO链接工作; 命令做了期望的效果。
然而,对于网页和其他几个环节; 如何删除:
的index.php?路径=普通/家庭
从URL? 我必须从字面上做一个查找和替换硬编码的PHP文件和风险升级或有另一种方式?
(无腹胀性能即没有差的业余工具,如vQmod)
简单地删除,你可以做一个基本的替代/catalog/controller/common/seo_url.php
找:
return $link;
它在新线建成之前 :
$link = str_replace('index.php?route=common/home', '', $link);
通过TheBlackBenzKid编辑:如果你想充分SEO只是用这条线,而不是上面的:
$link = str_replace('index.php?route=', '', $link);
另外,还要确保SEO的URL在商店的管理员控制台打开。
以前的“解决方案”是错误的,因为他们正在攻击SEO URL 翻译 。 你想要的是处理内部Opencart的URL 生成 。
让我们保持它的简单。 转到/system/library/url.php
,并期待在public function link
。 更换与此版本的功能:
public function link($route, $args = '', $connection = 'NONSSL') {
if ('NONSSL' == $connection) {
$url = $this->url;
} else {
$url = $this->ssl;
}
if ('common/home' == $route) {
if ($args) {
$url .= '?' . str_replace('&', '&', '&' . ltrim($args, '&'));
}
} else {
$url .= 'index.php?route=' . $route;
if ($args) {
$url .= str_replace('&', '&', '&' . ltrim($args, '&'));
}
}
foreach ($this->rewrite as $rewrite) {
$url = $rewrite->rewrite($url);
}
return $url;
}
简单的这样。 我不敢相信这是为什么不Opencart的核心。
编辑:
我运行一些测试,如果SEO网址的启用,有必要使一个单一的编辑在/catalog/controller/common/seo_url.php
,以避免“未定义指数”的错误。
内部public function rewrite
,替换此行:
parse_str($url_info['query'], $data);
这一个:
if (isset($url_info['query'])) parse_str($url_info['query'], $data);
现在,它确实有效。
我真的很喜欢上面的为胜者施罗德的解决方案很简单。 谢谢! 我创建了一个基于他的代码MODS的情况下,这将是有帮助的任何人vQmod。 这里是代码:
<modification>
<file name="system/library/url.php">
<operation>
<search position="before"><![CDATA[$url .= 'index.php?route=' . $route;]]></search>
<add><![CDATA[
if ('common/home' == $route) {
if ($args) {
$url .= '?' . str_replace('&', '&', '&' . ltrim($args, '&'));
}
} else {
]]></add>
</operation>
<operation>
<search position="before"><![CDATA[foreach ($this->rewrite as $rewrite) {]]></search>
<add><![CDATA[
}
]]></add>
</operation>
</file>
<file name="catalog/controller/common/seo_url.php">
<operation>
<search position="replace"><![CDATA[parse_str($url_info['query'], $data);]]></search>
<add><![CDATA[
if (isset($url_info['query'])) parse_str($url_info['query'], $data);
]]></add>
</operation>
</file>
</modification>
怎么样和替换标志的链接<?php echo $base; ?>
<?php echo $base; ?>
。 它将使一个链接到基本域,将删除index.php?route=common/home
。
周杰伦的解决方案并没有为我工作,编辑后,我得到空白屏幕。 所以我提出一个新问题:
把前行:
return $link;
相反,后:
public function rewrite($link) {
所以,我使用1.5.5.1关于这个问题没有人回答解决我的问题。 然而,结合从答案@Jay吉尔福特 , @TheBlackBenzKid和@rkaartikeyen我想出了一个完全可行的解决方案。
请记住,使搜索引擎的网址如图@TheBlackBenzKid 。
一种解释可以下面的代码被发现。
[php] class ControllerCommonSeoUrl extends Controller { public function index() { // Add rewrite to url class if ($this->config->get('config_seo_url')) { $this->url->addRewrite($this); } // Decode URL if (isset($this->request->get['_route_'])) { $parts = explode('/', $this->request->get['_route_']); foreach ($parts as $part) { $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE keyword = '" . $this->db->escape($part) . "'"); if ($query->num_rows) { $url = explode('=', $query->row['query']); if ($url[0] == 'product_id') { $this->request->get['product_id'] = $url[1]; } if ($url[0] == 'category_id') { if (!isset($this->request->get['path'])) { $this->request->get['path'] = $url[1]; } else { $this->request->get['path'] .= '_' . $url[1]; } } if ($url[0] == 'manufacturer_id') { $this->request->get['manufacturer_id'] = $url[1]; } if ($url[0] == 'information_id') { $this->request->get['information_id'] = $url[1]; } } else { $this->request->get['route'] = 'error/not_found'; } } if (isset($this->request->get['product_id'])) { $this->request->get['route'] = 'product/product'; } elseif (isset($this->request->get['path'])) { $this->request->get['route'] = 'product/category'; } elseif (isset($this->request->get['manufacturer_id'])) { $this->request->get['route'] = 'product/manufacturer/info'; } elseif (isset($this->request->get['information_id'])) { $this->request->get['route'] = 'information/information'; }else { $this->request->get['route'] = $this->request->get['_route_']; } if (isset($this->request->get['route'])) { return $this->forward($this->request->get['route']); } } } public function rewrite($link) { $url_info = parse_url(str_replace('&', '&', $link)); $url = ''; $data = array(); parse_str($url_info['query'], $data); foreach ($data as $key => $value) { if (isset($data['route'])) { if (($data['route'] == 'product/product' && $key == 'product_id') || (($data['route'] == 'product/manufacturer/info' || $data['route'] == 'product/product') && $key == 'manufacturer_id') || ($data['route'] == 'information/information' && $key == 'information_id')) { $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = '" . $this->db->escape($key . '=' . (int)$value) . "'"); if ($query->num_rows) { $url .= '/' . $query->row['keyword']; unset($data[$key]); } } elseif ($key == 'path') { $categories = explode('_', $value); foreach ($categories as $category) { $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = 'category_id=" . (int)$category . "'"); if ($query->num_rows) { $url .= '/' . $query->row['keyword']; } } unset($data[$key]); } } } if ($url) { unset($data['route']); $query = ''; if ($data) { foreach ($data as $key => $value) { $query .= '&' . $key . '=' . $value; } if ($query) { $query = '?' . trim($query, '&'); } } return $url_info['scheme'] . '://' . $url_info['host'] . (isset($url_info['port']) ? ':' . $url_info['port'] : '') . str_replace('/index.php', '', $url_info['path']) . $url . $query; } else { $link = str_replace('index.php?route=', '', $link); return $link; } } }
显然, @Jay吉尔福特和@TheBlackBenzKid解决正确写入页面上的URL的问题。
Line 113 $link = str_replace('index.php?route=', '', $link);
但似乎打破了网址,由于控制器无法找到页面,因此恢复到错误页面。
Line 38 - 40 } else { $this->request->get['route'] = 'error/not_found'; }
@ rkaartikeyen的解决方案由当前的路由设置请求的路径来解决这个问题
Line 51 - 53 else { $this->request->get['route'] = $this->request->get['_route_']; }
步骤01.允许使用搜索引擎优化的URL在您的商店服务器设置
进入“系统”,然后点击“设置”。 找到您要更改,然后单击右侧的“编辑”链接商店。 最后点击“服务器”选项卡和SEO URL的电台设置为“是”,保存设置。
注:关键字并不会自动为您创建。 你还必须有Apache的mod_rewrite的打开。 大多数的web主机在默认情况下有这样的。 本教程的步骤3将解释如何添加关键字。
步骤02.改变你的.htaccess文件的某些内容,使您的主页网址SEO友好
转到您的主机控制面板,编辑.htaccess文件。 有时,这种文件是隐藏,以取消隐藏它,你可以点击你的虚拟主机控制面板文件管理器,并勾选显示隐藏文件选项,其次是“走出去”按钮。
一旦你找到.htaccess文件更改下面几行:
RewriteBase /
RewriteRule ^sitemap.xml$ index.php?route=feed/google_sitemap [L]
RewriteRule ^googlebase.xml$ index.php?route=feed/google_base [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !.*\.(ico|gif|jpg|jpeg|png|js|css)
RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]
至:
RewriteBase /
RewriteRule ^sitemap.xml$ index.php?route=feed/google_sitemap [L]
RewriteRule ^googlebase.xml$ index.php?route=feed/google_base [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !.*\.(ico|gif|jpg|jpeg|png|js|css)
RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]
RewriteCond %{QUERY_STRING} ^route=common/home$
RewriteRule ^index\.php$ http://www.yourwebsite.co.uk? [R=301,L]
如果你这样做上述主页的步骤将从这样的改变: http://yourwebsite.com/index.php?route=common/home这样: http://yourwebsite.com
步骤03.输入SEO关键词为URL的手动最后,你需要输入搜索引擎关键字,你想拥有URL重写每一个页面,信息,产品和类别。 您可以编辑和创建项目时的数据标签下找到了SEO关键字领域。
一旦你进入了SEO关键词你的URL会工作。
一旦你已经遵循了所有这些说明你就可以开始获得较高的排名,增加流量和更多的客户带来的好处。
我来晚了,但我的解决方案可能是其他人(对Opencart的2.0.3.1测试)有用:
打开你的MySQL控制台,并运行此查询(改变YOURDATABASE您的数据库名):
INSERT INTO `YOURDATABASE`.`url_alias` (`url_alias_id`, `query`, `keyword`) VALUES (NULL, 'common/home', ' ');
这个怎么运作:
诀窍在于添加空格(“‘)为列‘关键字’,如果插入一个空字符串(’”)这种解决方法不起作用和URL重写将返回再次的index.php?路径=普通/家。
/catalog/controller/common/seo_url.php
打开该文件并替换下面的代码
<?php
class ControllerCommonSeoUrl extends Controller {
public function index() {
// Add rewrite to url class
if ($this->config->get('config_seo_url')) {
$this->url->addRewrite($this);
}
// Decode URL
if (isset($this->request->get['_route_'])) {
$parts = explode('/', $this->request->get['_route_']);
foreach ($parts as $part) {
$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE keyword = '" . $this->db->escape($part) . "'");
if ($query->num_rows) {
$url = explode('=', $query->row['query']);
if ($url[0] == 'product_id') {
$this->request->get['product_id'] = $url[1];
}
if ($url[0] == 'category_id') {
if (!isset($this->request->get['path'])) {
$this->request->get['path'] = $url[1];
} else {
$this->request->get['path'] .= '_' . $url[1];
}
}
if ($url[0] == 'manufacturer_id') {
$this->request->get['manufacturer_id'] = $url[1];
}
if ($url[0] == 'information_id') {
$this->request->get['information_id'] = $url[1];
}
} else {
$this->request->get['route'] = 'error/not_found';
}
}
if (isset($this->request->get['product_id'])) {
$this->request->get['route'] = 'product/product';
} elseif (isset($this->request->get['path'])) {
$this->request->get['route'] = 'product/category';
} elseif (isset($this->request->get['manufacturer_id'])) {
$this->request->get['route'] = 'product/manufacturer/info';
} elseif (isset($this->request->get['information_id'])) {
$this->request->get['route'] = 'information/information';
}else {
$this->request->get['route'] = $this->request->get['_route_'];
}
if (isset($this->request->get['route'])) {
return $this->forward($this->request->get['route']);
}
}
}
public function rewrite($link) {
if ($this->config->get('config_seo_url')) {
$url_data = parse_url(str_replace('&', '&', $link));
$url = '';
$data = array();
parse_str($url_data['query'], $data);
foreach ($data as $key => $value) {
if (isset($data['route'])) {
if (($data['route'] == 'product/product' && $key == 'product_id') || (($data['route'] == 'product/manufacturer/info' || $data['route'] == 'product/product') && $key == 'manufacturer_id') || ($data['route'] == 'information/information' && $key == 'information_id')) {
$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = '" . $this->db->escape($key . '=' . (int)$value) . "'");
if ($query->num_rows) {
$url .= '/' . $query->row['keyword'];
unset($data[$key]);
}
} elseif ($key == 'path') {
$categories = explode('_', $value);
foreach ($categories as $category) {
$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = 'category_id=" . (int)$category . "'");
if ($query->num_rows) {
$url .= '/' . $query->row['keyword'];
}
}
unset($data[$key]);
}else {
$url .= '/'.$value;
}
}
}
if ($url) {
unset($data['route']);
$query = '';
if ($data) {
foreach ($data as $key => $value) {
$query .= '&' . $key . '=' . $value;
}
if ($query) {
$query = '?' . trim($query, '&');
}
}
return $url_data['scheme'] . '://' . $url_data['host'] . (isset($url_data['port']) ? ':' . $url_data['port'] : '') . str_replace('/index.php', '', $url_data['path']) . $url . $query;
} else {
return $link;
}
} else {
return $link;
}
}
}
?>
------------------其中所述变化-------------------------
下面我行公共功能指数增加()也公开功能重写。
else {
this->request->get['route'] = $this->request->get['_route_'];
}
index()函数执行这样
我得到这个http://www.antropy.co.uk/index.php/blog/one-quick-opencart-seo-tip-to-avoid-a-duplicate-home-page/为我工作在去除码我的主页
在文件\系统\图书馆\ response.php在公共职能输出的开头添加下一行()
if (!defined('HTTP_CATALOG')) $this->output = str_replace(array('index.php?route=common/home', '?route=common/home'), '', $this->output);
我创建了一个VQMOD这一点。 免费下载这里: http://www.opencart.com/index.php?route=extension/extension/info&extension_id=14683
效果很好。
要删除index.php?route=
从网址我只是推荐给编辑.htaccess
文件。
只需添加这一点:
RewriteCond %{THE_REQUEST} \ /index\.php\?_route_=?([^&\ ]*)
RewriteRule ^ /%1? [L,R]
我遇到的任何问题任何责任。 只要记住,你必须激活RewriteEngine叙述 。 寻找这一行: RewriteEngine On
。 如果不存在,过去它之前上面的代码。