문제

I know that too much questions exist for htaccess redirection, but I couldn't find the exact solution. I'm sorry if there exist a matching question.

In my public html (webroot) folder there was following htaccess file:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

Then to redirect URLs with "www" to "non-www" I added two lines. And file became like this:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]

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

</IfModule>

So the problem is, www.example.com redirects to example.com but www.example.com/mycontroller/ weren't redirected to example.com/mycontroller/

How can I solve this?

도움이 되었습니까?

해결책

The first RewriteRule will rewrite every URL that doesn't have an actual physical file/folder to the index.php page but if there is a match, it will treat this as the last rule and stop processing all further rules (the [L] flag). So when you call with just the root path, it doesn't get triggered and continues to your www rewrite rule but any other logical URL triggers the first rewrite and stops.

Simply change the order of the rules, put your RewriteCond/RewriteRule pair before the default ones.

<IfModule mod_rewrite.c>
    RewriteEngine On

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

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]


</IfModule>

If you run this as virtual host and have access to Apache's config files , consider putting your rules in Apache's virtual host conf file to avoid this being overridden when you update Cake versions, or make sure to otherwise protect your changes.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top