繁体   English   中英

.htaccess将子目录重定向到根目录

[英].htaccess redirect sub-directory to root issue

我的主域绑定到我的public_html文件夹,但是我使用.htaccess重定向将根目录更改为该文件夹中的子目录,以使其更易于托管多个站点。 例:

public_html
-- .htaccess
-- site1
---- .htaccess
-- site2
-- site3

根目录中的.htaccess文件如下:

RewriteEngine on 

RewriteCond %{HTTP_HOST} ^(www.)?example.com$ 
RewriteCond %{REQUEST_URI} !^/subdirectory/ 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ /subdirectory/$1
RewriteCond %{HTTP_HOST} ^(www.)?example.com$ 
RewriteRule ^(/)?$ subdirectory/ [L]

这工作正常,但我认为与此有关以及我的site1目录中的.htaccess文件存在问题。 如果我输入URL,它有时会重定向到example.com/site1。 因此,该网站在example.com和example.com/site1上完全相同,但我不希望它显示为example.com/site1。 site1目录中的第二个.htaccess文件如下所示。

RewriteEngine on

# Change default directory page
DirectoryIndex /home/

# Remove .php extension
RewriteCond %{THE_REQUEST} ^GET\ /[^?\s]+\.php
RewriteRule (.*)\.php$ /$1/ [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^/(.+)/$
RewriteCond %{DOCUMENT_ROOT}/%1.php -f
RewriteRule ^(.*)/$ $1.php [L]

# Ensure all directory URLs have a trailing slash
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !\/$
RewriteCond %{REQUEST_URI} !\/[^\/]*\.[^\/]+$
RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI}/ [L,R=301]

# Same for HTTPS
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !\/$
RewriteCond %{REQUEST_URI} !\/[^\/]*\.[^\/]+$
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI}/ [L,R=301]

# Redirect default error page to home page
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^(/|error/)?$ /home/ [R=301,L]

# Error Documents
ErrorDocument 400 /error/?e=400
ErrorDocument 401 /error/?e=401
ErrorDocument 403 /error/?e=403
ErrorDocument 404 /error/?e=404
ErrorDocument 500 /error/?e=500

# Prevent viewing of htaccess file
<Files .htaccess>
    order allow,deny
    deny from all
</Files>

我不确定这是否是影响URL的各种重写规则的问题,但是如果可以解决该问题,我将不胜感激。

在此先感谢您,如果我的描述不好,我深表歉意。

尝试

# Ensure all directory URLs have a trailing slash
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !\/$
RewriteCond %{REQUEST_URI} !\/[^\/]*\.[^\/]+$
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1/ [QSA,L,R=301]

# Same for HTTPS
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !\/$
RewriteCond %{REQUEST_URI} !\/[^\/]*\.[^\/]+$
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [QSA,L,R=301]

这个对我有用。 %{REQUEST_URI}包含site1,所以不要使用它。 QSA添加任何URL参数,例如?param1 = val1&param2 = val2。如果不使用它们,则可以省略QSA。 同样,在测试时,将R = 301替换为R = 302(临时重定向),否则您的浏览器会记住该规则,并且不会再次发送请求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM