我有三个网站在共享主机(Bluehost)上运行,并拥有一个专用 IP 地址。描述如下:
example.com
=> 这是主站点和域名,是 WPexample.net
=> 这是一个附加域名(不知道您是否熟悉该术语)并且正在运行另一个 WP 网站subsite.example.net
=> 这是一个独立的 PHP 应用程序
每个 WP 都有自己的.htacess
文件,如下所示:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
使用此.htaccess
文件,两个 WP 网站都可以正常工作,但独立应用程序则不行。如果我删除该.htaccess
文件,情况则相反,独立应用程序可以工作,但 WP 网站不行。
有人能帮我找到解决这个问题的方法吗?
更新
.htaccess
我正在使用独立 PHP 应用程序文件的以下配置:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]
# Add Caching.
<FilesMatch ".(ico|jpg|jpeg|png|gif|js|css|swf)$">
Header set Cache-Control "max-age=10800"
</FilesMatch>
# Prevent viewing of htaccess file.
<Files .htaccess>
order allow,deny
deny from all
</Files>
# Prevent directory listings
Options All -Indexes
# Compress text, html, javascript, css, xml:
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
</IfModule>
但它不起作用,因为只要我点击任何链接,我就会被踢出应用程序。
独立站点位于/public_html/plataforma
而 WP 位于/public_html
。为什么我在这一点上做错了?
答案1
重要的是底层文件/目录结构。如果这 3 个站点本质上位于同一个帐户(同一个父目录)中,那么每个站点可能位于单独的子目录中(这通常是共享环境中插件和子域的默认设置),并且您应该.htaccess
在每个子目录中都有一个单独的文件。而不是全部都使用一个。
更新#1:尝试向 WordPress 添加例外.htaccess
,以明确排除通过子域访问的任何重写。例如:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{HTTP_HOST} !^subsite\.example\.net$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
然而,这实际上没有必要,因为(如评论中所述),独立应用程序.htaccess
文件中的 mod_rewrite 指令应该完全覆盖这些指令(因为独立应用程序位于子目录中)。
向块中添加代码的另一个警告WordPress
是,这可能会在下次更新时被覆盖。
更新#2:或者,尝试将RewriteOptions
指令添加到独立应用程序的.htaccess
文件(位于子目录中):
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteOptions IgnoreInherit
:
如果此方法有效,则似乎表明RewriteOptions InheritDown[Before]
服务器配置中存在一条指令,允许继承父目录中的 mod_rewrite 指令。请注意IgnoreInherit
和InheritDown[Before]
是 Apache 2.4+ 功能。
(编辑:看来 OP 是在 Apache 2.2.31 上,所以上述指令导致 500 内部服务器错误。)
更新#3:您还可以尝试RewriteBase /
从两个.htaccess
文件中删除该指令,并删除 WordPress 中的斜线前缀RewriteRule
代换匹配独立应用程序文件中的规则.htaccess
。因此,WordPress.htaccess
文件变为:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]
</IfModule>
# END WordPress
最后一行原来是:(RewriteRule . /index.php [L]
即带有斜线前缀)。斜线表示相对于根目录的 URL 路径,没有斜线则表示相对于包含该.htaccess
文件的目录的 URL 路径。
答案2
为你的独立 PHP 应用程序创建.htaccess
文件,将你的代码重定向到子站点.example.net