使用 htaccess 将 laravel 中的 http:// 重定向到 https:// 时如何删除 url 中的 'public'?

how to remove 'public' in url when redirecting http:// to https:// in laravel using htaccess?

当我使用 https://example.com 打开网站时,它会在 URL 中没有 public 打开,但是当我尝试打开 http://example.com 时,它会重定向到 [=18] =],在 URL.

中有 public

我想将 http:// 重定向到 https:// 但 URL 中没有 public

文件夹结构:

.htaccess 根目录下的文件代码

#disable directory browsing
Options -Indexes
<IfModule mod_rewrite.c>
   RewriteEngine On 
   RewriteRule ^(.*)$ public/ [L]
</IfModule>

#PROTECT ENV FILE
<Files .env>
order allow,deny
Deny from all
</Files>

#PROTECT ENV FILE
<Files .htaccess>
order allow,deny
Deny from all
</Files>

# BEGIN cPanel-generated php ini directives, do not edit
# Manual editing of this file may result in unexpected behavior.
# To make changes to this file, use the cPanel MultiPHP INI Editor (Home >> Software >> MultiPHP INI Editor)
# For more information, read our documentation (https://go.cpanel.net/EA4ModifyINI)
<IfModule php7_module>
   php_flag display_errors Off
   php_value max_execution_time 30
   php_value max_input_time 60
   php_value max_input_vars 1000
   php_value memory_limit -1
   php_value post_max_size 8M
   php_value session.gc_maxlifetime 1440
   php_value session.save_path "/var/cpanel/php/sessions/ea-php74"
   php_value upload_max_filesize 2M
   php_flag zlib.output_compression Off
</IfModule>
<IfModule lsapi_module>
   php_flag display_errors Off
   php_value max_execution_time 30
   php_value max_input_time 60
   php_value max_input_vars 1000
   php_value memory_limit -1
   php_value post_max_size 8M
   php_value session.gc_maxlifetime 1440
   php_value session.save_path "/var/cpanel/php/sessions/ea-php74"
   php_value upload_max_filesize 2M
   php_flag zlib.output_compression Off
</IfModule>
# END cPanel-generated php ini directives, do not edit

# php -- BEGIN cPanel-generated handler, do not edit
# Set the “ea-php74” package as the default “PHP” programming language.
<IfModule mime_module>
  AddHandler application/x-httpd-ea-php74 .php .php7 .phtml
</IfModule>
# php -- END cPanel-generated handler, do not edit

.htaccess 文件代码位于 public 目录

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Send Requests To Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>


您发布的代码中没有 HTTP 到 HTTPS 的重定向。如果这是在服务器配置中较早执行的,则需要在服务器配置中进行更正。但是,如果它稍后在您的应用程序中执行(错误地),那么您可以通过在 .htaccess 早期重定向来纠正此问题。这需要放在 /public/.htaccess 文件的顶部:

RewriteCond %{HTTPS} !on
RewriteRule (.*) https://example.com/ [R=301,L]

(假设 SSL 证书直接安装在您的应用程序服务器上,并且您没有使用代理来管理您的 SSL 连接。如果是这样,那么 条件 将需要有待调整。)

由于这是在 /public/.htaccess 文件中,捕获的反向引用 </code> 自然会排除 <code>/public/ 子目录,因此将其排除在重定向之外。

您应该首先使用 302(临时)重定向进行测试,以避免潜在的缓存问题。并确保您在测试前已清除浏览器缓存。

但是,以下规则存在问题,如果您请求带有尾部斜线的 URL,也会公开 /public 子目录:

# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]

如果它在根 .htaccess 文件中,这条规则就没问题,但是,如果它在 /public/.htaccess 文件(它需要在)中,那么 REQUEST_URI服务器变量包含 /public/ 目录(在内部重写请求之后)。您正在从变量中捕获 URL-路径。

这条规则应该这样写:

# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.+)/$ / [L,R=301]

这也稍微更有效率,并且无论它放在哪个 .htaccess 文件中都有效(尽管它应该在 /public/.htaccess 文件中,而不是根 .htaccess 中)。 旁白: 如果 /public 子目录没有从 URL 中 隐藏 那么这将不起作用,但事实并非如此这里的情况。