我正在构建一个应用程序 tshirtshop 我有以下配置
/etc/apache2/sites-enabled/tshirtshop
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/tshirtshop
<Directory /var/www/tshirtshop>
Options Indexes FollowSymLinks
AllowOverride All
Order allow,deny
allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
并在 .htaccess 文件中执行以下操作:
/var/www/tshirtshop/.htaccess
<IfModule mod_rewrite.c>
# Enable mod_rewrite
RewriteEngine On
# Specify the folder in which the application resides.
# Use / if the application is in the root.
RewriteBase /tshirtshop
#RewriteBase /
# Rewrite to correct domain to avoid canonicalization problems
# RewriteCond %{HTTP_HOST} !^www\.example\.com
# RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]
# Rewrite URLs ending in /index.php or /index.html to /
RewriteCond %{THE_REQUEST} ^GET\ .*/index\.(php|html?)\ HTTP
RewriteRule ^(.*)index\.(php|html?)$ $1 [R=301,L]
# Rewrite category pages
RewriteRule ^.*-d([0-9]+)/.*-c([0-9]+)/page-([0-9]+)/?$ index.php?DepartmentId=$1&CategoryId=$2&Page=$3 [L]
RewriteRule ^.*-d([0-9]+)/.*-c([0-9]+)/?$ index.php?DepartmentId=$1&CategoryId=$2 [L]
# Rewrite department pages
RewriteRule ^.*-d([0-9]+)/page-([0-9]+)/?$ index.php?DepartmentId=$1&Page=$2 [L]
RewriteRule ^.*-d([0-9]+)/?$ index.php?DepartmentId=$1 [L]
# Rewrite subpages of the home page
RewriteRule ^page-([0-9]+)/?$ index.php?Page=$1 [L]
# Rewrite product details pages
RewriteRule ^.*-p([0-9]+)/?$ index.php?ProductId=$1 [L]
</IfModule>
该网站正在本地主机上运行,并且运行方式就像没有指定 .htaccess 规则一样,即如果我要查看页面
http://localhost/tshirtshop/nature-d2
然后我得到一个 404 错误,但如果我查看同一个页面
http://localhost/tshirtshop/index.php?DepartmentId=2
然后我就可以看到它了。
sudo apache2ctl -M
Loaded Modules:
core_module (static)
log_config_module (static)
logio_module (static)
mpm_prefork_module (static)
http_module (static)
so_module (static)
alias_module (shared)
auth_basic_module (shared)
authn_file_module (shared)
authz_default_module (shared)
authz_groupfile_module (shared)
authz_host_module (shared)
authz_user_module (shared)
autoindex_module (shared)
cgi_module (shared)
deflate_module (shared)
dir_module (shared)
env_module (shared)
mime_module (shared)
negotiation_module (shared)
php5_module (shared)
reqtimeout_module (shared)
rewrite_module (shared)
setenvif_module (shared)
status_module (shared)
Syntax OK
如果有人能指出上述配置中的错误是什么,否则我需要检查其他东西?
答案1
我已经能够解决问题,当你安装 Ubuntu 并在其中使用 apache2 时,会有一个默认网站,只要在 ubuntu 中安装了 apache2,该网站就会被激活
因此处于活动状态的默认网站是
/etc/apache2/sites-enabled/000-default
我在 sites-enabled 目录中有 2 个文件
/etc/apache2/sites-enabled/tshirshop
/etc/apache2/sites-enabled/000-default
当 Ubuntu 的 Apache 从 sites-enabled 目录加载 vhosts 时
它按字母顺序加载 vhost 配置,因此 000-default 在 tshirtshop 之前加载,并且在 000-default 中有一行如下
DocumentRoot /var/www
<Directory /var/www/>
AllowOverride None
</Directory>
我的配置不起作用的原因 1) 请注意,AllowOverride None
000-default 中的优先级高于AllowOverride all
tshirtshop(按字母顺序加载虚拟主机),所以这就是我的 .htaccess 文件未加载的原因,因为 000-default 站点配置在读取 tshirtshop vhost 之前已加载,并且它已经带有一行AllowOverride None
2) 在我的 /etc/apache2/sites-enabled/tshirshop 文件中,我写道
DocumentRoot /var/www/tshirtshop
并以以下身份访问该应用程序
http://localhost/tshirtshop
所以我改变了 vhost tshirtshop 的 DocumentRoot
DocumentRoot /var/www/tshirtshop
到
DocumentRoot /var/www
并禁用Ubuntu的apache的默认站点
sudo a2dissite default
现在我的 /etc/apache2/sites-enabled/tshirtshop 配置正在被读取和应用。所以现在我的 .htaccess 文件被尊重。
答案2
我不确定这是否是一个与 Ubuntu 相关的问题,是否应该在这里询问。
但我发现问题在于,您正在通过 访问网站http://localhost/tshirtshop
,而/etc/apache2/sites-enabled/tshirtshop
文件的 documentRoot 和目录具有/var/www/tshirtshop
。这意味着此文件不用作 localhost 的配置 - 根据这些值,网站应该从 访问,而http://localhost
不是http://localhost/tshirtshop
。
如果文件未在/etc/apache2/sites-available
文件夹中创建,然后在默认设置被禁用后在终端中启用(这将创建指向已启用站点的符号链接),则可能会发生这种情况。
我不知道启用和禁用命令,因为我使用 webmin 来处理本地测试站点的设置。然后编辑我的/etc/hosts
文件以便能够访问更接近真实 URL 而不是本地主机的其他内容。
但回到问题,使用错误的 URL 会导致您的 rewriteRule 重写为,hhtp://localhost/index.php?DepartmentId=2
如果网站是通过 justhttp://localhost
而不是访问的,那么这将是正确的http://localhost/tshirtshop
。现在您可以看到为什么会出现 404 错误。