替换WordPress为Django后,mydomain.com/portal访问出现404错误求助
解决方案
问题核心是Django通过Passenger托管接管了所有根路径请求,包括/portal,导致WHMCS的URL重写规则无法生效。直接访问index.php能正常加载说明PHP解析环境正常,只需调整.htaccess规则,让/portal下的请求跳过Django,交给WHMCS处理。
修改根目录.htaccess文件
将以下规则插入现有配置中,放在Passenger配置块之前:
RewriteEngine On # 保留原有HTTPS强制跳转规则 RewriteCond %{HTTPS} !=on RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE] Header always set Content-Security-Policy "upgrade-insecure-requests;" # WHMCS URL重写:将/portal下非文件/非目录请求转发到index.php RewriteCond %{REQUEST_URI} ^/portal/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^portal/(.*)$ /portal/index.php/$1 [L,PT] # 让Passenger忽略/portal路径,避免Django拦截 PassengerIgnorePath /portal # DO NOT REMOVE. CLOUDLINUX PASSENGER CONFIGURATION BEGIN PassengerAppRoot "/home/user/mydomain.com" PassengerBaseURI "/" PassengerPython "/home/usr/virtualenv/mydomain.com/3.9/bin/python" # DO NOT REMOVE. CLOUDLINUX PASSENGER CONFIGURATION END # DO NOT REMOVE OR MODIFY. CLOUDLINUX ENV VARS CONFIGURATION BEGIN <IfModule Litespeed> </IfModule> # DO NOT REMOVE OR MODIFY. CLOUDLINUX ENV VARS CONFIGURATION END # 保留原有静态/媒体文件规则 <IfModule mod_rewrite.c> RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^static/(.*)$ /home/usr/mydomain.com/staticfiles/$1 [QSA,L,NC] </IfModule> <IfModule mod_rewrite.c> RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^media/(.*)$ /home/usr/mydomain.com/blog_images/$1 [QSA,L,NC] </IfModule> <FilesMatch "\.(?i:ico|flv|jpg|jpeg|png|gif|js|css)$"> <IfModule mod_expires.c> ExpiresActive On ExpiresDefault "access plus 1 month" </IfModule> FileETag MTime Size </FilesMatch>
关键规则说明
RewriteRule ^portal/(.*)$ /portal/index.php/$1 [L,PT]:将/portal下的动态请求(非文件/目录)转发到WHMCS的index.php,PT标志确保Apache继续将请求交给PHP解析,而非直接返回结果。PassengerIgnorePath /portal:明确告诉Passenger不要处理/portal路径的请求,彻底避免Django拦截。- 原有HTTPS跳转、静态缓存规则和CloudLinux系统配置全部保留,无需改动。
你之前尝试的规则仅调整了HTTPS跳转的范围,没有解决/portal请求被Django拦截的核心问题,因此无效。
内容的提问来源于stack exchange,提问作者kooroc
相关产品推荐
相关产品推荐

