我目前在OpenCart Admin中将User SEO URL's
设置为“是”。
System -> Settings -> Store -> Server -> User SEO URL's
到目前为止,所有标签和SEO链接都在工作;该命令已经达到了预期的效果。
但是对于主页和其他一些链接;我该如何删除:
的index.php?路线=公共/家
来自网址?我是否必须在硬编码PHP文件中进行查找和替换以及风险升级,还是有另一种方式?
(没有膨胀的表现,即没有糟糕的业余工具,如vQmod)
答案 0 :(得分:27)
要简单地删除它,您可以在/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网址。
答案 1 :(得分:7)
以前的“解决方案”是错误的,因为他们正在攻击SEO网址翻译。您想要的是处理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);
现在它确实有效。
答案 2 :(得分:7)
我非常喜欢VictorSchröder的解决方案,因为它非常简单。谢谢!我根据他的代码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>
答案 3 :(得分:2)
如何用<?php echo $base; ?>
替换徽标中的链接。它将建立到基本域的链接,并将删除index.php?route=common/home
。
答案 4 :(得分:2)
放在前面的行:
return $link;
而不是之后:
public function rewrite($link) {
答案 5 :(得分:2)
所以,我正在使用1.5.5.1并且没有人回答这个问题解决了我的问题。 但是,结合@Jay Gilford,@TheBlackBenzKid和@rkaartikeyen的答案,我想出了一个完全有效的解决方案。
请务必按@TheBlackBenzKid所示启用seo网址。
可以在代码下方找到解释。
[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 Gilford和@TheBlackBenzKid解决了网页上正确写入网址的问题。
Line 113 $link = str_replace('index.php?route=', '', $link);
但它似乎打破了网址,因为Controller无法找到页面,因此会恢复到错误页面。
Line 38 - 40 } else { $this->request->get['route'] = 'error/not_found'; }
@rkaartikeyen's解决方案通过将当前路由设置为请求的路由来解决此问题
Line 51 - 53 else { $this->request->get['route'] = $this->request->get['_route_']; }
答案 6 :(得分:2)
步骤01.在商店服务器设置中启用USE SEO URL
转到“系统”,然后单击“设置”。找到要更改的商店,然后单击右侧的“编辑”链接。最后单击“服务器”选项卡,将SEO URL的收音机设置为“是”并保存设置。
注意:不会自动为您创建关键字。您还必须打开Apache mod_rewrite。大多数Web主机默认启用此功能。本教程的第3步将介绍如何添加关键字。
步骤02.更改.htaccess文件中的部分内容,使您的主页SEO网址友好
转到主机控制面板并编辑.htaccess文件。有时隐藏此文件是为了取消隐藏它,您可以单击您的Web主机控制面板文件管理器并勾选show hidden files选项,然后单击“go”按钮。
找到.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的每个页面,信息,产品和类别输入SEO关键字。编辑和创建项目时,您可以在“数据”选项卡下找到SEO关键字的字段。
一旦您输入了SEO关键字,您的网址就会正常运行。
一旦您遵循了所有这些说明,您就可以开始获得更高排名,更高流量和更多客户的好处。
答案 7 :(得分:1)
我来晚了,但我的解决方案可能对其他人有用(在Opencart 2.0.3.1上测试):
打开MySQL控制台并运行此查询(使用您的数据库名称更改YOURDATABASE):
INSERT INTO `YOURDATABASE`.`url_alias` (`url_alias_id`, `query`, `keyword`) VALUES (NULL, 'common/home', ' ');
工作原理:
诀窍在于为列&#34;关键字&#34;添加白色空格(&#39;&#39;),如果您插入空字符串(&#39;&#39;)这个解决方法不起作用,url重写器将再次返回index.php?route = common / home。
答案 8 :(得分:0)
/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;
}
}
}
?>
------------------ 改变的地方 ---------------- ---------
我在Public Function index()中添加的以下行也是Public Function rewrite。
else {
this->request->get['route'] = $this->request->get['_route_'];
}
index()函数像这样执行
答案 9 :(得分:0)
我得到了http://www.antropy.co.uk/index.php/blog/one-quick-opencart-seo-tip-to-avoid-a-duplicate-home-page/为我删除主页的代码
答案 10 :(得分:0)
在file \ system \ library \ response.php中 在公共函数输出()
的开头添加下一行if (!defined('HTTP_CATALOG')) $this->output = str_replace(array('index.php?route=common/home', '?route=common/home'), '', $this->output);
答案 11 :(得分:0)
对我来说,最简单的方法:
1-转到/system/library/url.php
2-找到function link(
3-在return $url;
上方放置以下行:
$url = str_replace('index.php?route=common/home', '', $url);
答案 12 :(得分:0)
首先在您网站的根文件夹中,将 htaccess.txt 重命名为 .htaccess 。
然后转到 系统>设置>您的商店 。编辑。打开标签 服务器 并将使用SEO URL 设置为 是 。
现在打开 catalog / controller / startup / seo_url.php
找到} elseif ($key == 'path') {
添加之前
} elseif ($key == 'route') {
$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "seo_url WHERE `query` = '" . $this->db->escape($value) . "' AND store_id = '" . (int)$this->config->get('config_store_id') . "' AND language_id = '" . (int)$this->config->get('config_language_id') . "'");
if ($query->num_rows && $query->row['keyword']) {
$url .= '/' . $query->row['keyword'];
unset($data[$key]);
} else if ($data['route'] == "common/home") {
$url .= '/';
}
现在/index.php?route=common/home
变成了/
现在,尽管可以使用帐户/登录或信息/联系方式等结构在 设计> SEO URL 中设置SEO URL 。
答案 13 :(得分:0)
在 Opencart 3 中,如果你想重定向所有丑陋的 url,比如
index.php?route=common/home
index.php?route=account/register
index.php?route=product/product&path=244&product_id=481
您需要将漂亮的网址添加到 Admin -> Design -> SEO Urls
类似于
然后这样做:在catalog/controller/startup/seo_url.php
中,在函数index
中,之后
if ($this->config->get('config_seo_url')) {
$this->url->addRewrite($this);
}
添加这个
if (isset($this->request->get['route'])) {
if (DOMAIN_ROOT . $this->request->server['REQUEST_URI'] != $this->rewrite(DOMAIN_ROOT . $this->request->server['REQUEST_URI'])) {
$this->response->redirect($this->rewrite(DOMAIN_ROOT . $this->request->server['REQUEST_URI']));
}
}
elseif (strpos($this->request->server['REQUEST_URI'], 'index') !== false) {
$this->response->redirect(HTTPS_SERVER);
}
添加最后一步是用
在DOMAIN_ROOT
中定义config.php
define('DOMAIN_ROOT', 'https://www.somedomain.org'); // no slash, no subfolder
对我来说效果很好
答案 14 :(得分:-1)
我为此创建了一个VQMOD。免费下载:http://www.opencart.com/index.php?route=extension/extension/info&extension_id=14683
运作良好。
答案 15 :(得分:-1)
要从网址中删除index.php?route=
,我建议您修改.htaccess
文件。
只需添加:
RewriteCond %{THE_REQUEST} \ /index\.php\?_route_=?([^&\ ]*)
RewriteRule ^ /%1? [L,R]
我没有遇到任何问题。请记住,您需要启用 RewriteEngine 。寻找这一行:RewriteEngine On
。如果不存在,请在上面的代码之前通过它。