【问题标题】:.htaccess: Redirect 301 conflict with rewriterule.htaccess:重定向 301 与 rewriterule 冲突
【发布时间】:2016-11-18 23:23:15
【问题描述】:

我最近更新了一个旧网站,我想将所有旧页面 301 转换为每个页面的新版本。

这是我的 .htaccess

Options +FollowSymlinks -MultiViews
RewriteEngine On

#
# below are the 301 redirects
# **rules**

#
# below are the RewriteCond
# **rules**

#
# other stuff
#
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .* - [L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+?)/?$ $1.php [NC,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteCond %{THE_REQUEST} ^(.+)\.php([#?][^\ ]*)?\ HTTP/
RewriteRule ^(.+)\.php$ /$1 [R=301,L]

问题是一些旧链接的扩展名为oldfile.html,其他只是文件夹oldfolder/

在新版本上有productsproducts/categoryproducts/category/subcategory。这些网址是使用RewriteCond 生成的。

以下规则有效:

Redirect 301 /category/ /products/category

以下内容不起作用,而是将我重定向到主页。

Redirect 301 /old-folder/subcategory.html /products/category/subcategory 
# /products/category/subcategory is also a RewriteRule

这是.htaccess中的确切代码

# 301 rule
Redirect 301 /arredo-urbano/blocchi-standard.html /prodotti/arredo-urbano/001-blocchi-standard
# RewriteRule
RewriteRule ^prodotti/([^/]+)/([^/]+)/?$ prodotti.php?category=$1&subcategory=$2 [L]

我尝试在每个 Redirect 301 之后添加 [L] 标志,因此 .htaccess 的其余部分被忽略,但这会导致 500 Internal Error

所有重定向都是手动声明的,没有正则表达式或通配符,而且拼写正确。

有没有办法让所有重定向按预期工作?另外我不明白的是为什么[L] 标志会导致内部错误。

谢谢

【问题讨论】:

    标签: apache .htaccess redirect mod-rewrite


    【解决方案1】:

    关于重定向规则的三点建议:

    1. 在内部重写规则之前保留重定向规则
    2. 在通用模式匹配规则之前保留特定模式匹配规则
    3. 不要将Redirect (mod_alias) 规则与RewriteRule (mod_rewrite) 规则混用。

    在您的 .htaccess 中尝试这些规则:

    Options +FollowSymlinks -MultiViews
    RewriteEngine On
    
    RewriteRule ^category/?$ /products/category [L,NC,R=301]
    
    RewriteRule ^old-folder/subcategory\.html$ /products/category/subcategory [L,NC,R=301]
    #
    # below are the 301 redirects
    # **rules**
    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME}\.php -f
    RewriteCond %{THE_REQUEST} ^(.+)\.php([#?][^\ ]*)?\ HTTP/
    RewriteRule ^(.+)\.php$ /$1 [R=301,L]
    
    #
    # below are the RewriteCond
    # **rules**
    
    #
    # other stuff
    #
    RewriteCond %{REQUEST_FILENAME} -f [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule .* - [L]
    
    RewriteCond %{REQUEST_FILENAME}.php -f
    RewriteRule ^(.+?)/?$ $1.php [L]
    

    确保在测试此更改之前清除浏览器缓存。

    【讨论】:

    • 非常感谢,这似乎有效。我现在必须手动更改所有规则。只是一个问题:这与重定向相同吗?我可以改用 RewriteRule 吗?我这样做主要是为了 seo,因为旧网站的排名非常好,我不想失去它。
    • RewriteRuleR=301Redirect 相同,但功能更多
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 2015-06-13
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多