重写 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)