如何使用.htacces和cakephp将域从http重定向到https

时间:2017-08-16 03:53:26

标签: .htaccess redirect cakephp

我的应用程序托管在heroku上,我正在使用Cakephp API。我希望它重定向到https://www。并执行www。子域。

并且,他们有两个域指向同一个应用程序。

我在/app/.htaccess

中有以下代码
RewriteEngine on

RewriteBase /

#apply if no https
RewriteCond %{HTTPS} off    
#Ignore when is local env or any staging env
RewriteCond %{HTTP_HOST} !^local(.*) [NC]
RewriteCond %{HTTP_HOST} !^(.*)heroku(.*) [NC]

RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R=301]

#apply if https
RewriteCond %{HTTPS} on
#Ignore when is local env or any staging env or subdoamin is www.
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} !^local(.*) [NC]
RewriteCond %{HTTP_HOST} !^(.*)heroku(.*) [NC]
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [NE,L,R=301]

#default from cakephp
RewriteRule ^$ webroot/ [L]
RewriteRule (.*) webroot/$1 [L]

我在/app/webroot/.htaccess

中有以下代码
RewriteEngine On

RewriteBase /

#redirect any request from .poa.br to .com.br
RewriteCond %{HTTP_HOST} ^(.*)example\.poa\.br$ [NC]
RewriteRule ^(.*)$ https://www.example.com.br/$1 [NE,R=301,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

但它不起作用。只需将以下请求重定向到https://www.example.com.br

https://www.example.com.br 
https://www.example.poa.br 
http://www.example.poa.br 

此选项转到域,但没有https前缀。

http://www.example.com.br 

其他选项不起作用(返回DNS_PROBE_FINISHED_NXDOMAIN):

https://example.com.br 
http://example.com.br 
https://example.poa.br 
http://example.poa.br

5 个答案:

答案 0 :(得分:1)

在cakephp3中,我为此苦苦挣扎。我的解决方案是从

更改第一个.htaccess文件
User

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule    ^$    webroot/    [L]
    RewriteRule    (.*)   webroot/$1    [L]
</IfModule>

请注意302,我苦苦挣扎的原因是.htaccess被缓存并使得测试非常困难,我什至甚至删除了webroot中index.php中的所有cakephp代码,然后回显了“ test”一旦工作,我将302更改为301,以便.htaccess可以在浏览器中硬缓存。 (要测试index.php文件中是否存在HTTP:X-Forwarded-Proto之类的值var_dump($ _ SERVER))

如果您在没有HTTP:X-Forwarded-Proto的服务器上

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{HTTP:X-Forwarded-Proto} =http
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=302]
    RewriteRule    ^$    webroot/    [L]
    RewriteRule    (.*) webroot/$1    [L]
</IfModule>

答案 1 :(得分:0)

Hello确保在此工作之前打开重写模块。

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.yourwebsite.com/$1 [R,L]

并在您的基本网址中,您需要添加(。)到http。

我希望这会对你有所帮助。

您还可以添加'www'

只需添加此

RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]

答案 2 :(得分:0)

我们无法使用.htaccess将域重定向到Heroku中的www.domain。我们需要使用Heroku命令配置它。参见文章:

https://github.com/Helabs/pah/wiki/Configuring-domain-on-Heroku

https://devcenter.heroku.com/articles/custom-domains#add-a-custom-root-domain

我正在寻找如何强制使用https。

答案 3 :(得分:0)

在你的cakephp项目文件夹中更改你的htaccess文件:

<IfModule mod_rewrite.c>
  RewriteEngine on

  RewriteCond %{HTTPS} !=on
  RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R=301,L] 

  RewriteCond %{QUERY_STRING} ^(.*)http(\:|\%3A)(.*)$
  ReWriteRule .* - [F]    

  RewriteRule    ^$    webroot/    [L]
  RewriteRule    (.*) webroot/$1    [L]
</IfModule>

请注意,您的服务器(或您的虚拟主机)会侦听端口443(对于https)

<VirtualHost *:80>
    ServerAdmin subdomain@example.br
    ServerName subdomain.example.br
    ServerAlias subdomain.example.br
    DocumentRoot /var/www/subdomain
    <Directory /var/www/subdomain/>
        Options -Indexes +FollowSymLinks +MultiViews

        AllowOverride All
        Order Allow,Deny 
        Allow from All
    </Directory>

    ServerSignature Off
    ErrorLog /var/log/apache2/error.log
</VirtualHost>

<VirtualHost *:443>
    ServerAdmin subdomain@example.br
    ServerName subdomain.example.br
    ServerAlias subdomain.example.br
    DocumentRoot /var/www/subdomain
    <Directory /var/www/subdomain/>
        Options -Indexes +FollowSymLinks +MultiViews

        AllowOverride All
        Order Allow,Deny
        Allow from All
    </Directory>  
  SSLEngine on
  SSLProtocol all -SSLv2
  SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM

    SSLCertificateFile /[path to your CRT file]
    SSLCertificateKeyFile /[path to your PEM file]
    SSLCertificateChainFile [path to your CRT file]
    SSLCACertificatePath /etc/ssl/certs/
    SSLCACertificateFile /[path to your CRT file]
    ErrorLog /var/log/apache2/error.log
</VirtualHost>

答案 4 :(得分:0)

我在/app/webroot/.htaccess

中进行了所有配置

有一个技巧可以确定对Heroku的请求是否为https。

按照代码:

RewriteEngine On
RewriteBase /

#Identify if it is https
RewriteCond %{HTTP:X-Forwarded-Proto} !https

#ignore local env
RewriteCond %{HTTP_HOST} !^local(.*) [NC]

#apply redirect in all subdomain
RewriteCond %{HTTP_HOST} ^(.*)example\.com\.br$ [NC]
RewriteRule ^(.*)$ https://example.com.br/$1 [NE,R=301,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

我们决定将所有请求重定向到裸域,但如果您想更改为www,则可以执行以下命令。

RewriteRule ^(.*)$ https://www.example.com.br/$1 [NE,R=301,L]

由于