Apache htaccess文件重定向非www和https请求,并重写URL

Apache htaccess文件重定向非www和https请求,并重写URL,apache,.htaccess,url,redirect,rewrite,Apache,.htaccess,Url,Redirect,Rewrite,我正在尝试创建我的第一个.htaccess来进行URL重写和其他事情,但我已经浪费了两天时间搜索信息并试图使其工作,但没有成功 我希望达到以下目标: 1)将所有非www URL重定向到www URL(这似乎是seo的最佳实践?) 2)将所有https请求重定向到http请求: https://www.domain.com --> http://www.domain.com https://domain.com --> http://www.domain.com ww

我正在尝试创建我的第一个.htaccess来进行URL重写和其他事情,但我已经浪费了两天时间搜索信息并试图使其工作,但没有成功

我希望达到以下目标:

1)将所有非www URL重定向到www URL(这似乎是seo的最佳实践?)

2)将所有https请求重定向到http请求:

https://www.domain.com  -->  http://www.domain.com
https://domain.com      -->  http://www.domain.com
www.domain.com/abc    -->  www.domain.com/index.php?page=abc
www.domain.com/abc/   -->  www.domain.com/abc
3)将我的URL重写为SEO友好型,并最终去掉地址末尾的任何尾随斜杠:

https://www.domain.com  -->  http://www.domain.com
https://domain.com      -->  http://www.domain.com
www.domain.com/abc    -->  www.domain.com/index.php?page=abc
www.domain.com/abc/   -->  www.domain.com/abc

到目前为止,我所掌握的是三个片段,它们各自发挥作用:

# 1) This should be correct, I hope!
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]


这在一定程度上是有效的:它满足了我的要求,但当我在SEO友好URL后添加一个尾随斜杠时,所有的相对路径都被打断了:

www.domain.com/abc      OK
www.domain.com/abc/     page gets displayed but all relative URL for css and images are broken

我甚至不知道如何在一个htaccess文件中组合不同的规则,使它们正确地交互


很抱歉解释得太长,这个问题让我很沮丧。

css文件或图像的相对路径问题当然位于尾部斜杠中。浏览器认为他在子文件夹中,并将css文件的相对路径附加到当前位置,这将导致

www.domain.com/abc/styles/style.css
而不是

www.domain.com/styles/style.css
有两种方法可以解决此问题:

  • 我的首选解决方案是将html中的所有路径设置为绝对路径
  • 重定向到不带尾随斜杠的同一路径。因为您似乎忽略了尾随斜杠,所以这应该没有副作用。匹配规则如下所示

    RewriteRule ^([^/\.]+)/?$ http://%{HTTP_HOST}$1 [R=301,L]
    
  • 您的完整htaccess文件如下所示:

    RewriteEngine On
    RewriteCond %{HTTP_HOST} !^www\.
    RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
    
    RewriteCond %{HTTPS} =on
    RewriteRule .* http://%{SERVER_NAME}%{REQUEST_URI} [R,L]
    
    RewriteRule ^([^/\.]+)/$ http://%{HTTP_HOST}$1 [R=301,L]
    RewriteRule ^([^/\.]+)$ index.php?page=$1 [L]
    

    谢谢你的回复。此处缺少斜杠
    RewriteRule^([^/\.]+)/$http://%{http\u HOST}/$1[R=301,L]
    ,但这是一个简单的修复方法。不幸的是,如果我放入类似
    https://domain.com/abc/
    对不起,我的错。这是对我的虚拟服务器愚蠢的错误配置。它的工作100%完美,非常感谢你,现在这些htaccess文件似乎更容易理解我!再次感谢。
    RewriteEngine On
    RewriteCond %{HTTP_HOST} !^www\.
    RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
    
    RewriteCond %{HTTPS} =on
    RewriteRule .* http://%{SERVER_NAME}%{REQUEST_URI} [R,L]
    
    RewriteRule ^([^/\.]+)/$ http://%{HTTP_HOST}$1 [R=301,L]
    RewriteRule ^([^/\.]+)$ index.php?page=$1 [L]