关于 ubuntu 上的 .htaccess 文件的配置问题

关于 ubuntu 上的 .htaccess 文件的配置问题

我正在构建一个应用程序 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 alltshirtshop(按字母顺序加载虚拟主机),所以这就是我的 .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 错误。

相关内容