php - 如何为 yii2 分类广告网站重写 htaccess 或 urlManager 中的类别 url?
问题描述
我遇到了 seo 重复页面的问题,我认为当我创建一个类别时,网站会创建一个原始 url,然后使用 slug 创建该 url 的副本,因为我会发现自己有 2 个指向同一类别的 url有蛞蝓(seo-frindly)和另一个没有!
当用户点击一个类别时,它将获得对 seo 友好的 url,但由于另一个 url 仍在工作,即使它没有显示任何软件,谷歌以某种方式检测到它并显示我有重复
我想重写网址
example.com/category?slug=categoryName
至
example.com/category/categoryName
任何建议将不胜感激!
我尝试了很多代码htaccess
但没有结果,不幸的是我不熟悉 php 或 yii2 框架,甚至没有尝试urlManager
在 web.php 中进行修改以避免造成更多的损害:)
这是我的实际htacces
代码:
#Redirect www to non-www
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]
# BEGIN rewrite rules
<IfModule mod_rewrite.c>
RewriteBase /
# ADMIN APP
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !.*\.(ico|gif|jpg|jpeg|png|js|css)
RewriteCond %{REQUEST_URI} ^/admin(/.*)?$
RewriteRule admin/.* admin/index.php
# FRONTEND APP
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !.*\.(ico|gif|jpg|jpeg|png|js|css)
RewriteRule . index.php
</IfModule>
# END rewrite rules
<IfModule mod_setenvif.c>
<IfModule mod_headers.c>
# mod_headers, y u no match by Content-Type?!
<FilesMatch "\.(gif|png|jpe?g|svg|svgz|ico|webp)$">
SetEnvIf Origin ":" IS_CORS
Header set Access-Control-Allow-Origin "*" env=IS_CORS
</FilesMatch>
</IfModule>
</IfModule>
这是我的urlManager
代码:
urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'enableStrictParsing' => false,
'rules' => [
'search' => 'site/search',
'contact' => 'site/contact',
'<controller:conversation>/<action:delete>' => '<controller>/<action>',
'<controller:conversation>/<action:reply>/<conversation_uid:[a-z0-9_\-]+>' => '<controller>/<action>',
'<controller:account>/<action:invoices>/<page:\d+>' => '<controller>/<action>',
'<controller:account>/<action:conversations>/<page:\d+>' => '<controller>/<action>',
'<controller:listing>/<action:index|update|package|preview>/<slug:[a-z0-9_\-]+>' => '<controller>/<action>',
'page/<slug:[a-z0-9_\-]+>' => 'pages/index',
'<controller:category>/<action:location|map-view|get-map-location>' => '<controller>/<action>',
[
'pattern' => 'category/<slug:[a-z0-9_\-]+>/<page:\d+>',
'route' => 'category/index',
],
[
'pattern' => 'category/<slug:[a-z0-9_\-]+>',
'route' => 'category/index',
],
[
'pattern' => 'category/map-view/<slug:[a-z0-9_\-]+>/<page:\d+>',
'route' => 'category/map-view',
],
[
'pattern' => 'category/map-view/<slug:[a-z0-9_\-]+>',
'route' => 'category/map-view',
],
[
'pattern' => 'store/<slug:[a-z0-9_\-]+>/<page:\d+>',
'route' => 'store/index',
],
[
'pattern' => 'store/<slug:[a-z0-9_\-]+>',
'route' => 'store/index',
],
'<url:.+/>' => 'site/redirect'
],
解决方案
对配置启用严格解析。
如果您enableStrictParsing
将urlManager
配置更改为
'enableStrictParsing' => true,
不使用配置中定义的 URL 之一的请求将收到 404 作为响应,因此重复的URLexample.com/category?slug=categoryName
将不再有效。
该方法的Yii2 文档说:
是否启用严格解析。如果启用了严格解析,则传入的请求 URL 必须至少匹配 $rules 之一才能被视为有效请求。否则,请求的路径信息部分将被视为请求的路由。仅当 $enablePrettyUrl 为 true 时才使用此属性。
请记住,您需要为所有需要访问的 URL 定义规则,这意味着,例如,example.com
默认情况下不会定向到site/index
而是返回 404。
一个可以解决这个问题的示例规则是
'/' => 'site/index',
Yii2 文档有一篇关于路由的非常详细的文章,其中包括关于创建规则的详细部分。
推荐阅读
- c# - 匹配两个列表成员的最快方法
- php - 致命错误:无法重新分配自动全局变量 _GET
- workbox - 支持在 workbox-cli 中对非 webpack 用户进行捆绑
- javascript - ThreeJS根据子对象的几何形状改变父位置
- sockets - 在 c# 中使用 python 进行套接字编程
- javascript - 哪个更好 - 在传递参数时或在函数内部解构道具?
- excel - 获取文件,复制该文件,然后创建一个文件夹,然后将该文件粘贴到创建的文件夹中
- python - 如何最好地在函数中初始化 python 的随机模块
- android - 我无法在 Google Play 商店控制台上上传手机和观看 apk
- amazon-web-services - 使用 CLI 将代码部署到现有 Amazon EB 环境