htaccess rewrite cond 用于重写排除的 url 上的 404 错误

htaccess rewrite cond 用于重写排除的 url 上的 404 错误

我的.htaccess文件有这个问题。

Google 在网站管理员工具中索引了一些我不想要的 URL(404 错误)。

--我需要重写包含或/-结尾的 URL,-如下所示:

  1. --用。。。来代替-
  2. 删除-之后/
  3. 删除结尾-

...但前提是 URL 不包含product_info.php

我尝试过这个,但是没有用...

RewriteCond %{REQUEST_URI} !^/product_info\.php(.*)$
RewriteRule ^(.*)--(.*)$ /$1-$2 [L,R=301]
RewriteRule ^(.*)/-(.*)$ /$1/$2 [L,R=301]
RewriteRule ^(.*)-$ /$1$2 [L,R=301]

它位于 Magento 电子商务商店中,并激活了 Varnish 缓存。

编辑#1:

是的,它们出现在 404 错误报告中!

我说的不工作是指:Magento 显示“此文档已移至此处”。如果我点击那里,会出现“ESI Block 错误”

之后可能会有东西product_info.php?product=TestProduct--Green--XXL

在这种情况下,我不想替换--= ->,我认为这就是问题所在。

编辑#2:

这是完整的.htaccess。我删除了评论,期望重定向能够正常工作,因为空间太大了。

DirectoryIndex index.php
<IfModule mod_php5.c>
    php_value memory_limit 6144M
    php_value max_execution_time 18000
    php_flag magic_quotes_gpc off
    php_flag session.auto_start off
    php_flag suhosin.session.cryptua off
    php_flag zend.ze1_compatibility_mode Off
</IfModule>
<IfModule mod_security.c>
    SecFilterEngine Off
    SecFilterScanPOST Off
</IfModule>
<IfModule mod_deflate.c>
</IfModule>
<IfModule mod_ssl.c>
    SSLOptions StdEnvVars
</IfModule>
<IfModule mod_rewrite.c>
    Options +FollowSymLinks
    RewriteEngine on
    RewriteCond %{REQUEST_URI} ^/rma/
    RewriteRule ^ - [L]

#RewriteCond %{REQUEST_URI} !^/product_info(.*)     
#RewriteRule ^(.*)--(.*)$ /$1-$2 [L,R=301]
#RewriteCond %{REQUEST_URI} !^/product_info(.*)     
#RewriteRule ^(.*)/-(.*)$ /$1/$2 [L,R=301]
#RewriteCond %{REQUEST_URI} !^/product_info(.*)     
#RewriteRule ^(.*)-$ /$1$2 [L,R=301]



    RewriteRule ^api/rest api.php?type=rest [QSA,L]
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    RewriteCond %{REQUEST_METHOD} ^TRAC[EK]
    RewriteRule .* - [L,R=405]

    RewriteCond %{REQUEST_URI} !^/(media|skin|js)/

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-l
    RewriteRule .* index.php [L]

</IfModule>
    AddDefaultCharset Off
<IfModule mod_expires.c>
    ExpiresDefault "access plus 1 year"
</IfModule>
    Order allow,deny
    Allow from all
    <Files RELEASE_NOTES.txt>
        order allow,deny
        deny from all
    </Files>
    <Files cron.php>
        Order allow,deny
        Deny from all
    </Files>

答案1

RewriteCond指令仅适用于单身的 RewriteRule紧随其后的是。因此,您需要对每条规则重复此条件。例如:

Options +FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_URI} !^/product_info\.php
RewriteRule (.*)--(.*) /$1-$2 [L,R=301]

RewriteCond %{REQUEST_URI} !^/product_info\.php
RewriteRule (.*)/-(.*) /$1/$2 [L,R=301]

RewriteCond %{REQUEST_URI} !^/product_info\.php
RewriteRule (.*)-$ /$1 [L,R=301]

或者,您可以在规则开头包含一个例外,以避免对文件进行任何重写/product_info.php。但这取决于 .htaccess 文件的其余部分,因为它将完全排除/product-info.php被重写。例如:

RewriteRule ^product_info\.php$ - [L]

我还删除(.*)$条件模式- 在这个例子中,这是多余的。当您有一个 cacth-all 模式时,锚点也是如此.*(默认情况下是贪婪的)。

测试前请确保所有缓存都已清除。使用302(临时)重定向进行测试通常更容易,因为这些缓存不会被(或不应被)缓存。

相关内容