Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache 非www.domain未重定向到www.domain 简而言之_Apache_.htaccess_Mod Rewrite_Vhosts_Mod Vhost Alias - Fatal编程技术网

Apache 非www.domain未重定向到www.domain 简而言之

Apache 非www.domain未重定向到www.domain 简而言之,apache,.htaccess,mod-rewrite,vhosts,mod-vhost-alias,Apache,.htaccess,Mod Rewrite,Vhosts,Mod Vhost Alias,工作正常:www.exampledomain.co.uk{/带有任何url} 给出404错误:exampledomain.co.uk{/with any url} 详细地 我在linux/apache2上运行的一个站点上遇到了一个问题,其中“www.”url工作正常,但删除了“www.”后,每个url都会返回404。域在dnsstuff.com检查中没有显示错误,www和常规域指向相同的IP地址 当我使用cmd ping域和www.domain时,它们都解析为相同的IP并响应 我在web根目录中

工作正常:www.exampledomain.co.uk{/带有任何url}
给出404错误:exampledomain.co.uk{/with any url}

详细地 我在linux/apache2上运行的一个站点上遇到了一个问题,其中“www.”url工作正常,但删除了“www.”后,每个url都会返回404。域在dnsstuff.com检查中没有显示错误,www和常规域指向相同的IP地址

当我使用cmd ping域和www.domain时,它们都解析为相同的IP并响应

我在web根目录中的.htaccess文件中实现了这段代码,该文件用于将“www.”前置到非www请求上:

Options +FollowSymlinks
Options All -Indexes
RewriteEngine on
RewriteBase /

RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
然而,这也不起作用。准确的重写规则将在另一个站点上测试和运行,以强制使用前缀“www.”

这是正在使用的vhosts conf文件:

<VirtualHost *:80>
  ServerAdmin exampleuser@exampledomain.co.uk
  ServerName  www.exampledomain.co.uk
  ServerAlias exampledomain.co.uk

  DirectoryIndex index.php index.html
  DocumentRoot /home/exampleuser/public/example.co.uk/public_html
     <Directory /home/exampleuser/public/example.co.uk/public_html>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
    </Directory>

  LogLevel warn
  ErrorLog  /home/exampleuser/public/example.co.uk/log/error.log
  CustomLog /home/exampleuser/public/example.co.uk/log/access.log combined
</VirtualHost>

<VirtualHost *:80>
    ServerName exampledomain.co.uk
    Redirect permanent / http://www.exampledomain.co.uk/
</VirtualHost>

服务器管理员exampleuser@exampledomain.co.uk
服务器名www.exampledomain.co.uk
ServerAlias exampledomain.co.uk
DirectoryIndex.php index.html
DocumentRoot/home/exampleuser/public/example.co.uk/public\u html
选项索引跟随符号链接多视图
允许超越所有
命令允许,拒绝
通融
日志级别警告
ErrorLog/home/exampleuser/public/example.co.uk/log/error.log
CustomLog/home/exampleuser/public/example.co.uk/log/access.log组合
ServerName exampledomain.co.uk
重定向永久/http://www.exampledomain.co.uk/
服务器名称和别名的定义顺序与此处显示的相反(在更改之间apache会重新启动),随后添加了“重定向永久性”的第二个vhosts条目,但均无效


是什么导致了这种行为?还有什么我要查的吗?我已经搜索了这么多资料来找到解决方案,但没有发现任何错误或遗漏。任何帮助都将不胜感激

今天,我注意到,在以前的测试服务器实例中,/etc/apache2/sites enabled/中还有另一个vhosts conf文件,它被遗留下来,名为example.co.uk.conf——主exampledomain.co.uk.conf文件指向的站点的目录名是/home/exampleuser/public/example.co.uk/public\u html,因此我检查了内部,文件包含一个空的vhosts声明:

Options -Indexes
Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^example.com [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]
<VirtualHost *:80>
</VirtualHost>

当这个
部分被用散列注释掉或删除,或者conf文件被重命名为example.co.uk.conf以外的文件时,非www.请求被路由到正确的web根目录中,就像www.requests一样,问题得到了解决


但是,我不清楚为什么选择这个example.co.uk.conf来请求exampledomain.co.uk,而不是请求www.exampledomain.co.uk,所以如果有人可以扩展这个答案,请编辑或评论。谢谢

谢谢,尝试了你的重写规则,但没有效果。看起来和我已经拥有的东西一样,虽然不敏感。