首页 > 解决方案 > 如何为 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'
            ],

标签: php.htaccessyii2yii-url-manager

解决方案


对配置启用严格解析。

如果您enableStrictParsingurlManager配置更改为

'enableStrictParsing' => true,

不使用配置中定义的 URL 之一的请求将收到 404 作为响应,因此重复的URLexample.com/category?slug=categoryName将不再有效。

该方法的Yii2 文档说:

是否启用严格解析。如果启用了严格解析,则传入的请求 URL 必须至少匹配 $rules 之一才能被视为有效请求。否则,请求的路径信息部分将被视为请求的路由。仅当 $enablePrettyUrl 为 true 时才使用此属性。

请记住,您需要为所有需要访问的 URL 定义规则,这意味着,例如,example.com默认情况下不会定向到site/index而是返回 404。

一个可以解决这个问题的示例规则是

'/' => 'site/index',

Yii2 文档有一篇关于路由的非常详细的文章,其中包括关于创建规则的详细部分。


推荐阅读