我对重写规则感到疯狂阿帕奇。
基本上我想要实现的是重写任何 URL,例如:
http[s]://www.example.com/something
到
https://www.example.com
我在 apache 上有一个 VHost,如下所示:
<VirtualHost *:80>
ServerName example.com
ServerAlias example
DocumentRoot /var/www/html/example_courtesy
ServerAdmin [email protected]
RedirectMatch 404 /\.git
RedirectMatch 404 /\.svn
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/html/example_courtesy>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Require all granted
DirectoryIndex index.php indice.htm
</Directory>
RewriteEngine on
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName example.com
ServerAlias example
DocumentRoot /var/www/html/example_courtesy
ServerAdmin [email protected]
RedirectMatch 404 /\.git
RedirectMatch 404 /\.svn
[...]
我尝试从第一条规则中删除 [L],并在 *:443 VirtualHost 中添加如下重写规则:
RewriteEngine on
RewriteCond %{SERVER_PORT} !^80$
RewriteRule ^.*$ https://%{SERVER_NAME} [L,R]
我收到的是一个重写循环,Firefox 告诉我“该页面未正确重定向”。
我尝试了很多次重写规则,但是都没有成功。
我只能重写特定的 URL,例如https://www.example.com/specific-path到https://www.example.com和重定向匹配,但这不是我真正想要的。
有什么建议么?
我在这里搜索了类似的问题,但没有找到针对我的特定问题的解决方案。
答案1
您对 *.443 部分的 RewriteCond 存在明显问题。HTTPS(通常)在端口 443 上运行(如 VirtualHost 配置所示),但您的重写条件显示“如果服务器端口不是 80,则重定向到 https://...”。
因此,点击端口 443,请求内容,被告知转到 443,因为您不在 80 上。这是一个循环。
RewriteCond %{SERVER_PORT} !^443$
应该可以工作。
就我个人而言,我宁愿使用RewriteCond %{HTTPS} !=on
。