我在 中安装了 WordPress /var/www/wordpress/
,并在/var/www/project/
现在出现以下问题:当我尝试访问example.com/client/
或example.com/admin/
它应该链接到/var/www/project/
并从那里执行.htaccess + index.php。
我尝试在 Apache 配置中放置 Alias 指令,并取得部分成功。
Alias /admin/ /var/www/project
Alias /client/ /var/www/project
当我访问时example.com/client/
它工作正常,但是当我请求时example.com/client/login
它就会失败并出现File does not exist: /var/www/project/login
错误。
看起来像.htaccess
/var/www/project
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/(.*)$ index.php?module=$1&task=$2 [L,QSA]
答案1
首先:我最讨厌的事情,引自.htaccess 手册文件:
你应该完全避免使用 .htaccess 文件如果您有权访问 httpd 主服务器配置文件。使用 .htaccess 文件会降低 Apache http 服务器的速度。最好将 .htaccess 文件中包含的任何指令设置在目录块中,因为它将具有相同的效果且性能更好。
第二:几乎所有 mod_rewrite 问题的规范答案是这里
我不太确定,但我认为通过设置重写库内部/
重定向将指向 example.com/index.php,而不是 /var/www/project/index.php。另外,我认为太平洋标准时间需要标志来考虑别名匹配。
你可能想尝试
Alias /admin/ /var/www/project
Alias /client/ /var/www/project
<Directory /var/www/project>
RewriteEngine On
RewriteBase /
# Do nothing when a file or directory with the requested name exists
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.* - [L]
# Use the request URL to select the correct module and task
RewriteRule ^/([^/]+)/(.*)$ /$1/index.php?module=$1&task=$2 [PT,L,QSA]
</Directory>
答案2
这Alias 的文档表明这是预期的行为。Alias 会将所有尾随路径附加到别名路径之后。
我认为你想要的是扔掉别名中的附加路径信息,通过
AliasMatch /(admin|client)/.* /var/www/project
这应该将请求发送到 /var/www/project,同时保留原始请求的 URL 路径以供 RewriteRule 处理。