使用 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 中 隐藏 那么这将不起作用,但事实并非如此这里的情况。
当我使用 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 中 隐藏 那么这将不起作用,但事实并非如此这里的情况。