【问题标题】:.htaccess redirect sub-directory to root issue.htaccess 将子目录重定向到根问题
【发布时间】:2016-09-23 17:44:41
【问题描述】:

我的主域绑定到我的 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 的问题,但如果可以解决,我将不胜感激。

提前致谢,如果我的描述不够好,我深表歉意。

【问题讨论】:

    标签: php apache .htaccess redirect mod-rewrite


    【解决方案1】:

    试试

    # 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(临时重定向),否则您的浏览器会记住该规则并且不会再次发送请求。

    【讨论】:

    • 感谢您的回复!启用更改后,如果我访问 URL example.com/home 并故意省略尾部斜杠,而不是重定向以包含尾部斜杠,则由于重定向过多,该站点无法加载!添加我在 site1 文件夹中有一个用于网站资产的子目录可能会有所帮助,其中包含一个 .htaccess 文件,其中包含:Options -Indexes RewriteEngine On RewriteBase / # Disallow directory access IndexIgnore * 并且在省略资产文件夹的尾部斜杠时通常会出现问题。
    • 抱歉,在第一个块中添加了斜杠。
    • 感谢 Vasiliy,它适用于主目录中的页面!但是,我在上面说过,我有一个 assets 子目录,其中有一个 .htaccess 文件阻止访问。如果我导航到 example.com/assets/,它可以正常工作,但如果我省略尾部斜杠,它会重定向到 example.com/site1/assets/。如何解决?
    猜你喜欢
    • 1970-01-01
    • 2021-04-04
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多