重写 XAMPP VirtualHost 中的 URL

Posted

技术标签:

【中文标题】重写 XAMPP VirtualHost 中的 URL【英文标题】:Rewrite URL in XAMPP VirtualHost 【发布时间】:2021-12-15 13:37:41 【问题描述】:

一直在尝试在一个 Xampp 虚拟主机中通过 .htaccess 使用 mod_rewrite,但我没有得到我想要的结果。

我要做的是将以下内容重写:www.example.com/name/billy.html 为:www.example.com/billy

无需尝试重​​写虚拟主机运行正常的 URL,我可以访问所有页面。但是,当我使用相应的重写规则添加 .htaccess 时,我得到一个 404 页面未找到。正则表达式虽然按预期工作。我看到对www.example.com/name/billy.html 的请求已被重写为www.example.com/billy,但页面没有加载。

name 文件夹存在于文件结构中,.htaccess 位于example 文件夹内。

目前,我的 vh 配置如下所示:

<VirtualHost *:80>
  DocumentRoot "/Applications/XAMPP/xamppfiles/htdocs/example"
  ServerName www.example.com
  <Directory "/Applications/XAMPP/xamppfiles/htdocs/example">
     Options Indexes FollowSymLinks ExecCGI Includes
     AllowOverride All
     Require all granted
  </Directory>
</VirtualHost>

这是.htaccess文件的内容:

RewriteEngine On
RewriteRule ^name\/([a-z]+).html$ /$1 [L,NC,R]

缺少什么?

【问题讨论】:

你确定文件/Applications/XAMPP/xamppfiles/htdocs/hello/billy确实存在吗? /Applications/XAMPP/xamppfiles/htdocs/hello/billy 不存在。但是 /Applications/XAMPP/xamppfiles/htdocs/hello/billy.html 是的。就像我说的那样,没有 URL 重写一切工作正常。当我尝试重写到 www.hello.com/billy 时,我得到了 404 页面未找到。 旁白: "Rewrite URL in XAMPP VirtualHost" - 这个标题有点误导,因为您实际上并没有在 VirtualHost 中重写 URL,您使用的是 .htaccess . www.hello.com/billy 不存在,所以它必须是 www.hello.com/billy.html。将正则表达式更改为:^name\/([a-z]+.html)$,它将起作用。我在.html 之后移动了右括号。 【参考方案1】:

我要做的是将以下内容重写:www.example.com/name/billy.html 为:www.example.com/billy

您的流程似乎弄错了,可能混淆了“重写”和“重定向”?

您应该在内部重写从可见的“友好”URL 到实际处理请求的底层文件路径。你在这里试图做相反的事情。您的系统如何处理/billy 的请求? (它没有,并生成 404。)

您可能认为您可以更改单独使用.htaccess (mod_rewrite) 的 URL?但是不,这不是它的工作原理。

RewriteRule ^name\/([a-z]+).html$ /$1 [L,NC,R]

您提到“重写”,但该指令实际上是“重定向”(如R 标志所示)。具体来说,在这种情况下是 302(临时)重定向。

(如果您要更改现有的 URL 结构,您可能实际上想要实现这样的重定向,但稍后会详细介绍*1

URL“重写”完全在服务器内部。用户只看到公共 URL,他们看不到它可能被重写的 URL。您(用户)无法“看到”重写。

另一方面,“重定向”通常是指外部重定向,即。一个 3xx 响应发送回客户端,其中包含向不同 URL 发出新请求的指令。被重定向到的 URL 对用户可见。当内容移动到不同的 URL 时使用此选项。

因此,按照您的示例,您应该请求/链接到(在您的 HTML 源代码中)简短/友好的 URL /billy 并在内部将请求重写为实际处理请求的 /name/billy.html

例如:

RewriteEngine On

# Rewrite from "billy" to "name/billy.html"
RewriteRule ^[a-z]+$ name/$0.html [NC,L]

$0 反向引用包含与RewriteRule 匹配的整个 URL 路径模式

仅当您确实需要匹配大写字母时才使用 NC 标志。但是在区分大小写的操作系统上,/Billy 的请求不会为 /name/billy.html 提供服务。

就是这样,关于 URL 重写,你可以在这里停止阅读。


*1从旧重定向到新

关于上面提到的外部“重定向”。如果您正在更改现有 URL 结构并且旧 URL 已被搜索引擎索引和/或被外部第三方链接(或添加书签),您可能会选择实施重定向(在相反方向) - 以保留 SEO并让用户满意。

例如,假设您的原始 URL 格式为 /name/billy.html,而您后来决定将 URL 更改为 /billy。您首先更改 HTML 源代码中的 URL 并实现上面提到的“重写”,以便新的 URL 现在可以工作。然后,您可以实现从旧的/name/billy.html URL 到新的/billy URL 的外部重定向。

为此,您将使用最初的指令,但必须小心重定向循环,因为您已经在相反的指令中重写了请求。您只想重定向“直接/初始”请求,而不是通过较早的重写(实际上是在文件的后面)重写请求。检查“直接”请求的一种简单方法是检查 REDIRECT_STATUS 环境变量,该变量在初始请求时为空,并在请求被重写时设置为 200(如 200 OK 状态)。

例如,下面的“重定向”将在上面的“重写”之前,紧跟在RewriteEngine 指令之后:

# Redirect from "name/billy.html" to "/billy"
RewriteCond %ENV:REDIRECT_STATUS ^$
RewriteRule ^name/([a-z]+)\.html$ /$1 [R=301,NC,L]

这最终应该是 301(永久)重定向,因为 URL 可能已永久更改。但是,请始终使用 302(临时)重定向进行测试以避免潜在的缓存问题。


进一步阅读:

Reference: mod_rewrite, URL rewriting and "pretty links" explained

【讨论】:

以上是关于重写 XAMPP VirtualHost 中的 URL的主要内容,如果未能解决你的问题,请参考以下文章

添加 VirtualHost 失败:访问禁止错误 403 (XAMPP) (Windows 7)

添加 VirtualHost 失败:访问禁止错误 403 (XAMPP) (Windows 7)

添加 VirtualHost 失败:访问禁止错误 403 (XAMPP) (Windows 7)

添加 VirtualHost 失败:访问禁止错误 403 (XAMPP) (Windows 7)

VirtualHost 阻止 XAMPP 声明启动 Apache

如何在 XAMPP 的 VirtualHost 中访问 DocumentRoot 之外的文件?