Apache2 通配符重写

Apache2 通配符重写

我在 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 转换

相关内容