正斜杠和 mod_rewrite

正斜杠和 mod_rewrite

这可能是一个愚蠢的问题,但我花了好几天才弄清楚问题是什么。

我正在使用mod_rewrite并传递以正斜杠分隔的值。

问题是正斜杠改变了路径(我认为)

因此我传递了“ admin/login”,它将被定向到admin.php带有action参数的“ ” login

如果我使用对正斜杠进行编码,它可以正常工作%2F,但我的 url 看起来www.mysite/admin%2Flogin不如那么好看www.mysite/admin/login

正是 CSS 让我意识到发生了什么。登录页面加载时没有任何样式,返回主页的链接显示为www.mysite/admin而不是www.mysite

有人能帮我吗?我有点卡住了。有没有办法让 apache 不再将正斜杠视为路径更改,而无需对其进行编码?

干杯。

只是想补充一点,我现在发现,如果我将正斜杠改为等号,下面评论中的第一个规则就可以正常工作。它停止添加到网站路径。难道我描述的行为实际上是正常的吗?困惑...

------- 编辑 1 ------------ 规则如下。任何带斜线的内容都会导致我提到的行为。

RewriteRule ^(admin)/(login)$ admin.php?action=login [L]

RewriteRule ^(admin)$ admin.php?action=all-articles [L]

RewriteRule ^(admin)/([a-zA-Z0-9_]+)$ admin.php?action=articlesByTypeTag&topcat=$1 [L] 

------- 编辑 2 -------------- 好的,经过更多的麻烦之后,对于那些像我一样感到困惑的人(如果有的话),这里是最新消息。

因此,就浏览器而言,正斜杠肯定会添加到文档根目录。这是一个基本示例。在登录页面上,上面列表中的第一个规则处理该页面,我有一个返回主页的链接。它只是 href=".",在我开始使用 mod_rewrite 之前,它工作得很好。

现在,“admin/login”中的“admin”已添加到路径中,因此当我将鼠标悬停在主页链接上时,它会显示“localhost/admin/”。我将其更改为 href="/home",现在它可以正常工作。

我在 css 文件的链接中添加了正斜杠,现在它们也能正常工作了。我猜想这是因为路径现在是相对于虚拟主机中的文档根目录,而不是相对于浏览器所认为的路径。

也许这里的问题是整个路径比我想象的要复杂得多。我想要的是让 mod_rewrite 从“admin/login”获取值,并将它们应用到具有正确参数的正确 .php,这就是发生的事情。只是浏览器查看事物的方式发生了变化,令人困惑。

有人能告诉我这是否应该是这样的,或者我的设置真的有问题吗?

答案1

登录页面加载时没有任何样式,并且返回主页的链接显示为www.mysite/admin而不是www.mysite

因为你正在使用相对 URL在您的客户端 HTML 中。这实际上与 mod_rewrite 或服务器端“设置”没有任何关系。是的,“这才是应该的”。

浏览器只是解析相对 URL相对的到当前 URL(即浏览器地址栏中显示的 URL)。(但是,如果您有baseHTML 元素,则可以覆盖此设置 - 请参阅下文。)浏览器对服务器配置一无所知。因此,如果您的 HTML 页面位于 URL 处,http://example.com/url/path/to/foo并且您有一个相对的形式的链接(CSS、JS、图像或锚点)href="subdir/bar",则浏览器会自然地将其解析为http://example.com/url/path/to/subdir/bar,这就是请求的 URL。这与服务器上的哪个文件实际处理请求无关(在这种情况下,它可能是完全不同的东西,例如/home/www/user/public_html/cgi-bin/script)。URL 和(服务器端)文件系统路径是两个不同的东西。

为了解决这个问题,您需要在客户端 HTML 中使用根相对 URL(以斜杠开头)(如您所做的那样),甚至使用绝对 URL(方案 + 主机名)。

如上所述,另一种“修复”相对 URL 的替代方法(解决方法)是使用HTML 页面base部分中的元素head。这将覆盖相对链接的当前 URL,并声明所有相对链接的 URL相对的例如,要使所有相对链接相对的到根文档,那么您可以执行以下操作:

<base href="http://example.com/index.html">

但是,使用base元素并非毫无注意事项。仅使用片段标识符(例如#top)的页内链接现在与 元素中指定的 URL 相关base,这很少是可取的。

相关内容