6个.htaccess重写规则:删除index.html,删除.html,强制非www,强制尾随斜杠。

3

我需要提供有关我的网站环境的一些信息。

  1. 我在根目录下拥有静态网页。

  2. WordPress安装在子目录www.domain.com/blog/中。

  3. 我有两个.htaccess文件,一个在根目录中,另一个在WordPress文件夹中。

我想要:

  • 将所有URL中的www删除(以下代码已实现)。
  • 从URL中删除index.html(以下代码已实现)。
  • 删除所有.html扩展名/重定向301到没有.html扩展名的网址(以下代码已实现)。
  • 在静态网页中添加尾部斜杠/重定向301从无尾部斜杠(需要帮助)。
  • 强制WordPress网页添加尾部斜杠/重定向301从无尾部斜杠(以下代码已实现)。

一些示例:

domain.tld/index.html >> domain.tld/

domain.tld/file.html >> domain.tld/file/

domain.tld/file.html/ >> domain.tld/file/

domain.tld/wordpress/post-name >> domain.tld/wordpress/post-name/

我的根目录.htaccess中的代码为:

    <IfModule mod_rewrite.c> 
    Options +FollowSymLinks -MultiViews


    RewriteEngine On 
    RewriteBase /

    #removing trailing slash
    RewriteCond %{REQUEST_FILENAME} !-d     
    RewriteRule ^(.*)/$ $1 [R=301,L]

    #www to non
    RewriteCond %{HTTP_HOST} ^www\.(([a-z0-9_]+\.)?domain\.com)$ [NC]
    RewriteRule .? http://%1%{REQUEST_URI} [R=301,L]

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

    #index redirect 
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.html\ HTTP/ 
    RewriteRule ^index\.html$ http://domain.com/ [R=301,L]
    RewriteCond %{THE_REQUEST} \.html 
    RewriteRule ^(.*)\.html$ /$1 [R=301,L] 
    </IfModule> 

    <IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /blog/
    # Force Trailing Slash for wordpress
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)[^/]{1}$ %{REQUEST_URI}/ [L,R=301]
    </IfModule> 

以上代码的作用是:

  1. 将www重定向到非www
  2. 去除结尾的斜杠(如果存在)
  3. 删除index.html
  4. 删除所有.html
  5. 将301重定向到没有结尾斜杠的文件名
  6. 强制使用WordPress的尾随斜杠,并从结尾没有斜杠的地方进行301重定向

编辑

#removing trailing slash Rule usage

removing trailing slash Rule


另请参阅RFC 2606。 - TRiG
@André Bonna 原始的 URL 是 domain.tld/file.html,上述代码剥离了 HTML 并重定向 301 到 domain.tld/file,现在我想将其重定向到 domain.tld/file/。 - Ghada AlSamman
如果您想要添加尾部斜杠,那么为什么要使用“删除尾部斜杠”规则? - anubhava
示例:domain.com/file.html/ 在剥离 .html 之前先去掉末尾的斜杠 - Ghada AlSamman
你需要将 WP 特定规则放在 /blog/.htaccess 中而不是主 .htaccess 中。你想要添加尾随斜杠的示例 URL 是什么? - anubhava
显示剩余7条评论
2个回答

5

针对站点根目录的 .htaccess 文件应按照以下方式设置:

<IfModule mod_rewrite.c> 
Options +FollowSymLinks -MultiViews

RewriteEngine On 
RewriteBase /

#www to non
RewriteCond %{HTTP_HOST} ^www\.(([a-z0-9_]+\.)?domain\.com)$ [NC]
RewriteRule ^(.+?)/?$ http://%1/$1/ [R=301,L]

RewriteCond %{THE_REQUEST} \s/+(.+?)\.html/?[\s?] [NC]
RewriteRule ^ /%1/ [R=301,NE,L]

#index redirect 
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.html\ HTTP/ 
RewriteRule ^index\.html$ http://%{HTTP_HOST}/ [R=301,L]

# add a trailing slash to non files
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*?[^/])$ %{REQUEST_URI}/ [L,R=301,NE]

# add html internally
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^.]+)/$ $1.html [L]

</IfModule>

在测试之前,请务必清除您的浏览器缓存。

谢谢@anubhava,但它对http://ghadaalsaman.com/poem-list.html无效<<它会给出500错误, http://ghadaalsaman.com/en/poem-list <<以及那个文件, 请打开http://www.redirect-checker.org/index.php并检查该页面http://ghadaalsaman.com/books.html/有多少重定向。 - Ghada AlSamman
谢谢您的更新,现在一切都好了,我可以将最终重定向从302改为301吗? - Ghada AlSamman
1
当我请求http://ghadaalsaman.com/books.html/时,它会重定向到301。您的浏览器缓存存在旧问题。 - anubhava
1
正如您所看到的,所有 *.html 的重定向规则都是相同的,因此,如果一个显示 301,而另一个 .html 显示 302,则这是由于其他原因而不是规则造成的。 - anubhava
1
添加了那行代码后它就可以工作了。 RewriteCond %{REQUEST_URI} !sitemap [NC] 谢谢。 - Ghada AlSamman
显示剩余4条评论

3
RewriteEngine On 

RewriteBase /   

从WWW到Non

RewriteCond %{HTTP_HOST} ^www.domain\.tld$ [NC]

RewriteRule ^(.*)$ http://domain.tld/$1 [L,R=301]

从URL中删除index.html

RewriteRule ^index.html$ / [L,R=301]

删除所有.html扩展名 / 将301重定向到没有.html扩展名的URL

RewriteRule ^([a-zA-z0-9]+).html$ /$1   [L,R=301]

为静态网页添加尾随斜杠 / 从非尾随斜杠重定向301

RewriteRule ^([a-zA-z0-9]+).html$ /$1/   [L,R=301]

强制给WordPress网页添加尾部斜杠/从没有尾部斜杠的页面进行301重定向

RewriteRule /blog/([^/]+) /blog/$1/ [L,R=301]

谢谢您的回复,但是您的解决方案似乎无法正常工作。 - Ghada AlSamman
@GhadaAlSamman,您在此答案中的代码中放置.htaccess文件的位置在哪里? - SaidbakR
在根目录下的 .htaccess 文件 - Ghada AlSamman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接