从 http 重定向到 https 时从 url 中删除斜杠
Slash being removed from url when redirecting from http to https
出于某种原因,当我在他们的任何页面上以非 https 格式访问这些 url 之一时,它会将您重定向到损坏的 link,其中斜线已被删除(从而更改 url 中的实际域并将用户带离现场)。
http://www.example.com/fr-FR does a 302 redirect to https://www.example.comfr-fr
在顶层,一切正常,http://www.example.com redirects to https://www.example.com
我尝试编辑 .htaccess 文件以捕获所有 http 并重定向到 https,但没有成功。我试图将特定的 url 重定向到他们的 https 对应物,但在我的重定向被命中之前,我们仍然命中了相同的 302 重定向。
我也在 vhost 文件中尝试了许多不同的重定向,但出于某种原因似乎没有任何影响这个问题。我也试过删除 .htaccess 并删除 vhost 文件以删除任何有罪的代码,但这也无济于事。
有谁知道可能导致此问题的原因吗?
这是 .conf 文件:
<VirtualHost *:80>
ServerName example.com/
ServerAlias www.example.com/
DocumentRoot /var/www/2lbgfz7l.example.com
DirectoryIndex index.html
ErrorLog /var/log/apache2/2lbgfz7l.example.com.error.log
CustomLog /var/log/apache2/2lbgfz7l.example.com.access.log combined
Redirect 301 / https://www.example.com/
<Location / >
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^(.*) /index.html/ [NC,L]
</Location>
<Directory "/var/www/2lbgfz7l.example.com">
Options -Indexes +FollowSymLinks -MultiViews
AllowOverride All
</Directory>
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName example.com/
ServerAlias www.example.com/
DocumentRoot /var/www/2lbgfz7l.example.com
DirectoryIndex index.html
ErrorLog /var/log/apache2/example.com.error.log
CustomLog /var/log/apache2/example.com.access.log combined
<Directory "/var/www/2lbgfz7l.example.com">
Options -Indexes +FollowSymLinks -MultiViews
AllowOverride All
</Directory>
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
SSLEngine on
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE [2-6]" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
SSLCertificateChainFile /etc/apache2/ssl.crt/example.com.chain-2.pem
SSLCertificateFile /etc/apache2/ssl.crt/example.com.chain-2.pem
SSLCertificateKeyFile /etc/apache2/ssl.crt/example.com.key
</VirtualHost>
</IfModule>
这是 .htaccess 文件:
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access 1 year"
ExpiresByType image/jpeg "access 1 year"
ExpiresByType image/gif "access 1 year"
ExpiresByType image/png "access 1 year"
ExpiresByType text/css "access 1 month"
ExpiresByType text/html "access 1 month"
ExpiresByType application/pdf "access 1 month"
ExpiresByType text/x-javascript "access 1 month"
ExpiresByType text/css "access plus 1 year"
ExpiresByType application/x-shockwave-flash "access 1 month"
ExpiresByType image/x-icon "access 1 year"
ExpiresDefault "access 1 month"
</IfModule>
<IfModule mod_headers.c>
<FilesMatch "\.(js|css|xml|gz)$">
Header append Vary: Accept-Encoding
</FilesMatch>
</IfModule>
<ifModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file .(html?|txt|css|js|php|pl)$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude mime ^image/.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</ifModule>
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/html text/css text/plain text/xml text/x-js text/js
</IfModule>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/ [R=301,L]
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/ [R=301,L]
</IfModule>
看起来问题是我在 /etc/apache2/sites-available
中处理的 .conf 文件没有被服务器读取,因为在 /etc/apache2/sites-enabled
中我没有指向 .conf 文件的符号链接在 /sites-available 中工作时,有一个 .conf 文件的副本,服务器正在读取该文件。这个 conf 文件持有不正确的重定向 - 一旦我删除了这个重复文件并通过 运行
添加了一个符号链接
sudo ln -s /etc/apache2/sites-available/example.com.conf
从 etc/apache2/sites-enabled
目录,读取了我更新的 .conf 文件。
在我更新的文件中,我删除了指令:
<Location / >
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^(.*) /index.html/ [NC,L]
</Location>
删除后问题解决。
出于某种原因,当我在他们的任何页面上以非 https 格式访问这些 url 之一时,它会将您重定向到损坏的 link,其中斜线已被删除(从而更改 url 中的实际域并将用户带离现场)。
http://www.example.com/fr-FR does a 302 redirect to https://www.example.comfr-fr
在顶层,一切正常,http://www.example.com redirects to https://www.example.com
我尝试编辑 .htaccess 文件以捕获所有 http 并重定向到 https,但没有成功。我试图将特定的 url 重定向到他们的 https 对应物,但在我的重定向被命中之前,我们仍然命中了相同的 302 重定向。
我也在 vhost 文件中尝试了许多不同的重定向,但出于某种原因似乎没有任何影响这个问题。我也试过删除 .htaccess 并删除 vhost 文件以删除任何有罪的代码,但这也无济于事。 有谁知道可能导致此问题的原因吗?
这是 .conf 文件:
<VirtualHost *:80>
ServerName example.com/
ServerAlias www.example.com/
DocumentRoot /var/www/2lbgfz7l.example.com
DirectoryIndex index.html
ErrorLog /var/log/apache2/2lbgfz7l.example.com.error.log
CustomLog /var/log/apache2/2lbgfz7l.example.com.access.log combined
Redirect 301 / https://www.example.com/
<Location / >
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^(.*) /index.html/ [NC,L]
</Location>
<Directory "/var/www/2lbgfz7l.example.com">
Options -Indexes +FollowSymLinks -MultiViews
AllowOverride All
</Directory>
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName example.com/
ServerAlias www.example.com/
DocumentRoot /var/www/2lbgfz7l.example.com
DirectoryIndex index.html
ErrorLog /var/log/apache2/example.com.error.log
CustomLog /var/log/apache2/example.com.access.log combined
<Directory "/var/www/2lbgfz7l.example.com">
Options -Indexes +FollowSymLinks -MultiViews
AllowOverride All
</Directory>
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
SSLEngine on
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE [2-6]" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
SSLCertificateChainFile /etc/apache2/ssl.crt/example.com.chain-2.pem
SSLCertificateFile /etc/apache2/ssl.crt/example.com.chain-2.pem
SSLCertificateKeyFile /etc/apache2/ssl.crt/example.com.key
</VirtualHost>
</IfModule>
这是 .htaccess 文件:
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access 1 year"
ExpiresByType image/jpeg "access 1 year"
ExpiresByType image/gif "access 1 year"
ExpiresByType image/png "access 1 year"
ExpiresByType text/css "access 1 month"
ExpiresByType text/html "access 1 month"
ExpiresByType application/pdf "access 1 month"
ExpiresByType text/x-javascript "access 1 month"
ExpiresByType text/css "access plus 1 year"
ExpiresByType application/x-shockwave-flash "access 1 month"
ExpiresByType image/x-icon "access 1 year"
ExpiresDefault "access 1 month"
</IfModule>
<IfModule mod_headers.c>
<FilesMatch "\.(js|css|xml|gz)$">
Header append Vary: Accept-Encoding
</FilesMatch>
</IfModule>
<ifModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file .(html?|txt|css|js|php|pl)$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude mime ^image/.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</ifModule>
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/html text/css text/plain text/xml text/x-js text/js
</IfModule>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/ [R=301,L]
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/ [R=301,L]
</IfModule>
看起来问题是我在 /etc/apache2/sites-available
中处理的 .conf 文件没有被服务器读取,因为在 /etc/apache2/sites-enabled
中我没有指向 .conf 文件的符号链接在 /sites-available 中工作时,有一个 .conf 文件的副本,服务器正在读取该文件。这个 conf 文件持有不正确的重定向 - 一旦我删除了这个重复文件并通过 运行
sudo ln -s /etc/apache2/sites-available/example.com.conf
从 etc/apache2/sites-enabled
目录,读取了我更新的 .conf 文件。
在我更新的文件中,我删除了指令:
<Location / >
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^(.*) /index.html/ [NC,L]
</Location>
删除后问题解决。