如何让含子域名的所有页面URL在浏览器中显示为.asp而非.php?
问题:让通配符子域名下的.php页面URL在地址栏显示为.asp
我持有site.com域名及通配符子域名,所有页面均为.php扩展名。需求是:当在浏览器中打开如sub.site.com/page.php这类链接时,地址栏要显示为sub.site.com/page.asp。所有子域名对应独立子目录,我的site.com.conf配置文件中有如下配置行:VirtualDocumentRoot /var/www/site.com/public_html/%1/
我尝试过多种.htaccess配置方案均无效,以下是两种无效的配置示例:
第一种无效配置
RewriteEngine On RewriteBase / RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteRule ^(.*)$ https://%1/$1 [R=301,L] RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*)\.asp$ $1.php [L]
第二种无效配置
RewriteEngine On RewriteBase / RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteRule ^(.*)$ https://%1/$1 [R=301,L] RewriteEngine On RewriteBase / RewriteCond %{HTTP_HOST} ^(.+)\.site\.com$ [NC] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*)\.asp$ $1.php [L]
解决方案
你需要同时配置外部重定向(修改地址栏显示)和内部映射(后台执行PHP文件)两条规则,且避免重复启用RewriteEngine。以下是可生效的.htaccess配置:
RewriteEngine On RewriteBase / # 移除www前缀 RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteRule ^(.*)$ https://%1/$1 [R=301,L] # 外部重定向:将.php请求跳转至.asp,更新地址栏 RewriteCond %{THE_REQUEST} \s/+(.*?)\.php[\s?] [NC] RewriteRule ^ /%1.asp [R=301,L,NE] # 内部映射:将.asp请求转发至对应.php文件处理 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI}.php -f RewriteRule ^(.*)\.asp$ $1.php [L]
规则说明
- 外部重定向规则通过
%{THE_REQUEST}匹配原始请求,避免内部映射时触发循环,确保只有用户直接访问.php链接时才会跳转。 NE标记防止URL中的特殊字符被不必要编码。- 内部映射规则通过
%{DOCUMENT_ROOT}适配子域名对应的子目录,确保能正确找到对应的.php文件。
额外注意
- 确认Apache服务器已启用
mod_rewrite模块。 - 若子域名目录有独立的.htaccess,将上述配置放置到对应目录中即可;若使用主目录的.htaccess,VirtualDocumentRoot的配置会自动适配子目录路径。
内容的提问来源于stack exchange,提问作者rhje
相关产品推荐
相关产品推荐

