当URL是以下任何一个时,从HTTP到HTTPS的redirect都正确发生:
http://example.com >> https://example.com [确定] http://www.example.com >> https://example.com [确定] http://www.example.com/login >> https://example.com/login [确定] 但是,如果URL如下所示,redirect到HTTPS将失败 :
http://example.com/login >>错误(请参见截图)
请告知如何解决。
代码和configuration如下。 先谢谢你…
其他详情:
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews </IfModule> RewriteEngine On # Allow Blog in Sub-Directory RewriteCond $1 !^(blog) #Redirect to non-WWW RewriteCond %{HTTP_HOST} ^www.example.com$ RewriteRule ^(.*) https://example.com/$1 [QSA,L,R=301] # Redirect Trailing Slashes If Not A Folder... RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/$ /$1 [L,R=301] # Handle Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] # Handle Authorization Header RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] </IfModule>
(example.com.conf)
<VirtualHost *:80> ServerName example.com ServerAlias example.com ServerAdmin [email protected] DocumentRoot /var/www/example.com_dev/public <Directory "/var/www/example.com_dev/public"> DirectoryIndex index.php AllowOverride All Order allow,deny Allow from all </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost> <VirtualHost *:80> ServerName example.com ServerAlias www.example.com ServerAdmin [email protected] DocumentRoot /var/www/example.com_dev/public <Directory "/var/www/example.com_dev/public"> DirectoryIndex index.php AllowOverride All Order allow,deny Allow from all </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
(实施例-ssl.com.conf)
<IfModule mod_ssl.c> <VirtualHost _default_:443> ServerAdmin [email protected] ServerName example.com ServerAlias example.com DocumentRoot /var/www/example.com_dev/public ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined SSLEngine on SSLCertificateFile /etc/apache2/ssl/example_com.crt SSLCertificateKeyFile /etc/apache2/ssl/example_com.key SSLCertificateChainFile /etc/apache2/ssl/example_com.ca-bundle <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory /usr/lib/cgi-bin> SSLOptions +StdEnvVars </Directory> <Directory "/var/www/example.com_dev/public"> DirectoryIndex index.php AllowOverride All Order allow,deny Allow from all </Directory> BrowserMatch "MSIE [2-6]" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown </VirtualHost> </IfModule> <IfModule mod_ssl.c> <VirtualHost _default_:443> ServerAdmin [email protected] ServerName example.com ServerAlias www.example.com DocumentRoot /var/www/example.com_dev/public ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined SSLEngine on SSLCertificateFile /etc/apache2/ssl/example_com.crt SSLCertificateKeyFile /etc/apache2/ssl/example_com.key SSLCertificateChainFile /etc/apache2/ssl/example_com.ca-bundle <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory /usr/lib/cgi-bin> SSLOptions +StdEnvVars </Directory> <Directory "/var/www/example.com_dev/public"> DirectoryIndex index.php AllowOverride All Order allow,deny Allow from all </Directory> BrowserMatch "MSIE [2-6]" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown </VirtualHost> </IfModule>
(app / Http / middleware / HttpsProtocol.php – Laravel 5.3)
<?php namespace App\Http\Middleware; use Closure; class HttpsProtocol { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { if(!$request->secure()){ return redirect()->secure($request->getRequestUri()); } return $next($request); } }
(app / Http / Kernel.php – Laravel 5.3)
<?php namespace App\Http; use Illuminate\Foundation\Http\Kernel as HttpKernel; class Kernel extends HttpKernel { /** * The application's global HTTP middleware stack. * * These middleware are run during every request to your application. * * @var array */ protected $middleware = [ \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, ]; /** * The application's route middleware groups. * * @var array */ protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, \App\Http\Middleware\HttpsProtocol::class, ], 'api' => [ 'throttle:60,1', 'bindings', ], ]; /** * The application's route middleware. * * These middleware may be assigned to groups or used individually. * * @var array */ protected $routeMiddleware = [ 'auth' => \Illuminate\Auth\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, ]; }
解决了。 原来的问题是, 000-default.conf虚拟主机仍然处于活动状态(启用),并拦截http://example.com/*这样的请求。 一旦被禁用,使用:
a2dissite 000-default.conf
一切开始按预期工作。
http://example.com>>https://example.com[确定]http://example.com/login>>错误(请参见截图)
从你的代码转储我实际上看不到这些情况下处理(尽pipe你说第一个工作正常)?
由于您似乎在执行.htaccess的wwwredirect:
#Redirect to non-WWW RewriteCond %{HTTP_HOST} ^www.example.com$ RewriteRule ^(.*) https://example.com/$1 [QSA,L,R=301]
那么你可以尝试改变它:
RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP_HOST} ^www\.example\.com RewriteRule (.*) https://example.com/$1 [R=301,L]
这包含对HTTP的检查。 所以,如果HTTP 或 www然后redirect到没有 www HTTPS。
在testing之前,您将需要清除所有caching,因为错误的301会被浏览器caching。
你似乎已经复制了两个虚拟主机的端口80和443? 这可能会导致你的问题。 您只需要一个VirtualHost用于端口80,另一个用于端口443:
ServerName example.com ServerAlias example.com
应该:
ServerName example.com ServerAlias www.example.com
像你有重复 。 (然后删除重复。)