htaccess - canonical URL when redirecting to subdirectory

血红的双手。 提交于 2019-12-22 12:09:12

问题


I've been playing around with this problem for quite a while but can't find the way how to achieve what I want. I want user coming to my website test.com to reach index.php located in subdirectory www immediatelly, which I am able to do. But when the URL is test.com/www I want it to be just test.com.

Snippets of code:

.htaccess in /

RewriteRule ^(.*)$ /www/$1 [L]

.htaccess in /www

RewriteCond %{REQUEST_URI} ^/www.*$
RewriteRule ^/www/(.*)$ /$1 [L]

gives me 500 Internal Error.

UPDATE: I came to a solution thanks to @Justin Iurman's answer:

.htaccess in /www

RewriteCond %{THE_REQUEST} \ /www/?(.*)\ HTTP/ [NC]
RewriteRule ^(.*)$ /%1 [R=301,L]

Have another problem tho. On the server machine I have multiple websites and I want to serve files according to HTTP_HOST variable in root .htaccess file. I redirect user accessing test.com to proper directory (say test), but I want URL test.com/test to redirect just to test.com. Directory test contains directory www where user is redirected and it does not stick to URL thanks to solution above. I would like to edit just .htaccess file in webserver root so I don't have any dependancy on websites' domains in projects.

SOLVED

.htaccess in webserver root:

<IfModule mod_rewrite.c>
    RewriteEngine On

    # Redirect test.com/test (and everything into test folder) to test.com root
    RewriteCond %{HTTP_HOST} ^test\.com$ [NC]
    RewriteCond %{THE_REQUEST} \ /test/? [NC]
    RewriteRule ^.*$ / [R=301,L]

    # Forward (internally rewrite) test.com/one/example/page to test.com/test/www/one/example/page
    RewriteCond %{HTTP_HOST} ^test\.com$ [NC]
    RewriteRule ^(.*)$ /test/www/$1 [L]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
</IfModule>

.htaccess in the "test" directory:

<IfModule mod_rewrite.c>
    RewriteEngine On

    # allow /test in URL only for certain filetypes
    RewriteRule ^(.*\.(pdf|js|ico|gif|jpg|png|css|rar|zip|tar\.gz))$ /test/www/$1 [L]

    # allow /test on localhost
    RewriteCond %{HTTP_HOST} ^localhost$ [NC]
    RewriteRule ^(.*)$ /test/www/$1 [L]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
</IfModule>

Thanks a lot Justin!


回答1:


You have to avoid infinite loop when doing what you want.

Put this code in your htaccess

RewriteEngine on

RewriteCond %{THE_REQUEST} \ /www/?(.*)\ HTTP/ [NC]
RewriteRule . /%1 [R=301,L]

RewriteRule ^(.*)$ /www/$1 [L]

EDIT: taking your update into consideration, here's the new code

RewriteEngine on

# Redirect test.com/test (and everything into test folder) to test.com root
RewriteCond %{HTTP_HOST} ^test.com$ [NC]
RewriteCond %{THE_REQUEST} \ /test/? [NC]
RewriteRule . / [R=301,L]

# Forward (internally rewrite) test.com/one/example/page to test.com/test/www/one/example/page
RewriteCond %{HTTP_HOST} ^test.com$ [NC]
RewriteRule ^(.*)$ /test/www/$1 [L]


来源:https://stackoverflow.com/questions/23243449/htaccess-canonical-url-when-redirecting-to-subdirectory

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!