我在本地计算机上的 d:\www\mysite 目录中有一个网站。我安装了 WAMPServer 并为我的站点设置了一个别名目录 mysite

因此,例如, http://localhost/mysite/static-resource.html 正确检索了位于 d:\www\mysite\static-resource.html 中的我的文件。

我的问题是我的 .htaccess 文件中的 URL 重写:

RewriteEngine On
RewriteRule ^articles/(\d+) ./article.php?id=$1

当我尝试访问 http://localhost/mysite/articles/1 时,我得到以下响应:



我可以确认 article.php 中存在一个 d:\www\mysite\article.php 文件。

过去,我将网站的根目录 (d:\www\mysite) 设置为 Apache 服务器的 DocumentRoot(而不是默认的 c:\wamp\www),在这种情况下,我的 URL 重写 工作 ,所以我当前的问题必须与我的网站在别名目录“后面”这一事实有关。

我的 mysite.conf 文件的内容:
Alias /mysite/ "d:/www/mysite/"

<Directory "d:/www/mysite/">
    Options Indexes FollowSymLinks MultiViews
    AllowOverride all
        Order allow,deny
    Allow from all
</Directory>

最佳答案

我在您的重写规则中没有看到 RewriteBase。
在您的 .htaccess 中,添加 RewriteBase 规则。

RewriteEngine On
RewriteBase /mysite/
RewriteRule ^articles/(\d+) ./article.php?id=$1

由于您的 /mysite/,RewriteBase 必须有 Alias /mysite/ "d:/www/mysite/"
如果只是 http://localhost/mysite 被访问,它应该返回一个 not found on this server
如果您不希望发生这种情况,请在上面添加另一个别名,如下所示:
Alias /mysite "d:/www/mysite/"

或者

只是这个:
AliasMatch /mysite(/.*)? d:/www/mysite/$1

为什么是 RewriteBase?来自 RewriteBase Directive :



来自 RewriteBase Directive 的示例:
#
#  /abc/def/.htaccess -- per-dir config file for directory /abc/def
#  Remember: /abc/def is the physical path of /xyz, i.e., the server
#            has a 'Alias /xyz /abc/def' directive e.g.
#

RewriteEngine On

#  let the server know that we were reached via /xyz and not
#  via the physical path prefix /abc/def
RewriteBase   /xyz

#  now the rewriting rules
RewriteRule   ^oldstuff\.html$  newstuff.html

关于apache - 如果通过别名目录访问网站,则 URL 重写不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9254403/

10-13 02:48