我基本上在这里找到了解决方案的一部分:Apache 重写规则并保持 URL 不变?
但我还想做更多。
我想打开一个“template.php”网站,输入任何 URN 即可显示。因此,如果我打开 abc.com/blabla,模板就会打开,URL 仍为 abc.com/blabla。如果我输入 abc.com/lalala,模板就会打开,URL 仍为 abc.com/lalala。
我想这就是我想要的:
RewriteRule ^/$ /template.php
除此之外,我希望我的主站点 abc.com 打开 index.php 并使用 https 重写,我喜欢这样做:
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
我怎样才能在一个配置中实现这两者?https 部分不会弄乱 URN 部分吗?
答案1
RewriteRule ^/$ /template.php
假设该指令位于服务器或者虚拟主机上下文(即不是一个目录或.htaccess
上下文),那么这将只匹配对文档根目录(即/
)的请求,而忽略/blabla
和/lalala
。
要匹配<anything>
,除了index.php
(或空的 URL 路径,假设index.php
设置为 DirectoryIndex)之外,请执行以下操作:
RewriteRule ^/(index\.php|template\.php)?$ - [L]
RewriteRule ^ /template.php [L]
/
如果请求或/index.php
或,第一条规则将停止任何进一步处理,这允许访问/template.php
您的主站点(即)并防止重写循环。index.php
第二条规则将所有其他 URL(无论它们是否直接映射到文件系统资源)重写为/template.php
。
您不希望静态资源(图像、CSS、JS 等)被排除在这次重写之外,这很不寻常,但您已在评论中证实了这一点。
RewriteEngine On RewriteCond %{HTTPS} !=on RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
由于您处于主服务器配置中(即不是.htaccess
),因此无论如何您都不应该使用 mod_rewrite 发出 HTTP 到 HTTPS 重定向。您应该Redirect
在非规范<VirtualHost *:80>
容器中有一个简单的 mod_alias。
https 部分不会混淆 URN 部分吗?
不。(回答这个具体问题 - 如果您使用 mod_rewrite。)
当然,这是假设您按照正确的顺序输入了指令。从 HTTP 到 HTTPS 的外部重定向应该首先出现。