这可能是一个愚蠢的问题,但我花了好几天才弄清楚问题是什么。
我正在使用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)。(但是,如果您有base
HTML 元素,则可以覆盖此设置 - 请参阅下文。)浏览器对服务器配置一无所知。因此,如果您的 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
,这很少是可取的。