我在 Apache2 上有一个 php 应用程序,它应该在代码级别处理子域。
我的目标是将任何通配符子域重定向到主域的 index.php。我不使用 .htaccess。
我搜索了 Stackoverflow 并在 Google 上搜索了解决方案,但找不到。虚拟主机如下所示:
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName website.com
ServerAlias *.website.com
DocumentRoot /var/www/html/site_admin/public_html
# Directory path where code exists
<Directory /var/www/html/site_admin/public_html>
Options Indexes FollowSymLinks
AllowOverride All
Order allow,deny
allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/website.com-error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel error
CustomLog ${APACHE_LOG_DIR}/website.com.log combined
RewriteEngine On
#If the domain (any domain) is not exactly website.com...
RewriteCond %{HTTP_HOST} !^website\.com$ [NC]
RewriteRule (.*) http://(.*).website.com [L,R=301,QSA]
RewriteRule ^.*$ /index.php [NC,L]
</VirtualHost>
当我访问主域名时,我可以看到网站内容。但是,如果我访问 sub.website.com,我会被重定向到 %28.%2A%29.website.com
请指教
提前致谢
伊加尔
答案1
如果 PHP 代码本身处理子域规则,则无需使 Apache 配置过于复杂。这是我对支持多个地址的 PHP 项目所做的:
<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot /var/www/project/public
ServerName website.com
ServerAlias *.website.com *.* *.*.*
DirectoryIndex index.php index.html
ErrorLog ${APACHE_LOG_DIR}/project-error.log
CustomLog ${APACHE_LOG_DIR}/project-access.log combined
</VirtualHost>
<Directory /var/www/project/public>
Options FollowSymLinks
AllowOverride All
Order Allow,Deny
Allow From All
</Directory>
请注意该行中的多个通配符ServerAlias
。这将允许服务器响应全部流量,即使应用程序不知道该域名(这允许基于 PHP 重定向到其他捕获过程)。
我通常将重写规则保留在 Apache 配置之外,而是将它们放在文件中.htaccess
,据我所知,您目前不使用该文件。经验表明,将重写保留在配置文件之外可以减少“奇怪情况”。
这是我.htaccess
使用上面的 Apache 配置来配置用于项目的文件的方法:
Options +MultiViews +FollowSymLinks
Options -Indexes
DirectoryIndex index.php
RewriteEngine On
RewriteBase /
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^.*$ ./index.php
Header always edit Set-Cookie (.*) "$1; SameSite=None; Secure"
<filesMatch "\.(ico|css|js|pdf|jpg|jpeg|png|gif)$">
Header set Cache-Control "max-age=1209600, public"
</FilesMatch>
<FilesMatch "\.(htaccess|htpasswd|inc|log|sql|user|token)$">
Order Allow,Deny
Deny from all
</FilesMatch>
<ifModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/xml text/css text/plain
AddOutputFilterByType DEFLATE image/svg+xml application/xhtml+xml application/xml
AddOutputFilterByType DEFLATE application/rdf+xml application/rss+xml application/atom+xml
AddOutputFilterByType DEFLATE text/javascript application/javascript application/x-javascript application/json
AddOutputFilterByType DEFLATE application/x-font-ttf application/x-font-otf
AddOutputFilterByType DEFLATE font/truetype font/opentype
</ifModule>
这样,Apache 就会将所有流量传递到基于 PHP 的站点,并由该代码执行重定向、访问控制和 URL 转换