mod_rewrite规则强制www和https超过主域,忽略1个文件夹和1个其他域

时间:2015-04-27 01:31:39

标签: php wordpress apache .htaccess mod-rewrite

我已经尝试了(可能超过250)不同的重写规则,但没有一个能达到预期的效果。

maindomain.com

规则这是一个带有SSL&amp ;;的wordpress网站应该使用前缀www.

运行
  • 检查并强制www.到整个域/文件夹/子文件夹...等(不仅仅是wordpress) EXCEPT 文件夹testfolder
  • 检查并强制https.到整个域/文件夹/子文件夹...等(不仅仅是wordpress) EXCEPT 文件夹testfolder
test.otherwebsite.com

规则,这是在服务器/testfolder/中托管的自定义网页集

  • 检查并强行删除域www.
  • 中的test.otherwebsite.com
  • 检查并强制将https更改为http
  • 中的test.otherwebsite.com

如果第一套规则正常工作,我不应该考虑这些规则。

2 个答案:

答案 0 :(得分:0)

如果您有权访问主配置文件,则无需使用重写引擎。

(1)将非www重定向到www。一个更简单的解决方案是使用VirtualHost指令而不是重写引擎。

<VirtualHost *:80>
    ServerName maindomain.com
    Redirect permanent / http://www.maindomain.com/
</VirtualHost>

<VirtualHost *:80>
    ServerName www.maindomain.com
    # ... Your www served here
</VirtualHost>

对于https,您只需复制它们并将端口替换为443。

(2)在单独的VirtualHost指令

中提供/testfolder
<VirtualHost *:80>
    ServerName test.otherwebsite.com
    # ... anything else
</VirtualHost>

对于https,将端口更改为443。

请注意,如果从/testfolder访问,则www.maindomain.com/testfolder不会例外。

解决方案是移动testfolder所服务的www.maindomain.com外部目录。例如

/var/www/maindomain <--- directory for www.maindomain.com
/var/www/testfolder <--- directory for test.otherwebsite.com

有一个<DirectoryMatch>指令可以防止这种情况,如https://stackoverflow.com/a/214908/779320所述。但我担心它适用于全球,因此无法在任何VirtualHost中提供服务。但无论如何你都可以测试它。

答案 1 :(得分:0)

1)您可以在DOCUMENT_ROOT/.htaccess文件中使用此代码:

RewriteEngine On

RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule !^testfolder/ https://www.maindomain.com%{REQUEST_URI} [NE,NC,R=301,L]

2)然后您可以在/testfolder/.htaccess文件中使用此代码:

RewriteEngine On

RewriteCond %{HTTPS} on [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^ http://test.otherwebsite.com%{REQUEST_URI} [NE,R=301,L]