.htaccess 从中重写哈希URL/

.htaccess 从中重写哈希URL/,.htaccess,mod-rewrite,hashtag,.htaccess,Mod Rewrite,Hashtag,我在这里做了一点研究,发现hashtags是客户端的,不能用.htaccess重写,但我想我正在尝试做的恰恰相反 我使用的是Kirkas.ch中的assensor.js,它允许一个包含不同“部分”(称为楼层)的单页网站显示为单独的部分 结构是这样的: site.com/#/floorname site.com/#/otherfloor site.com/#/andyetanotherfloor 诸如此类 我想做的是制作“永久链接”,这样当有人键入时: site.com/floorname …

我在这里做了一点研究,发现hashtags是客户端的,不能用.htaccess重写,但我想我正在尝试做的恰恰相反

我使用的是Kirkas.ch中的assensor.js,它允许一个包含不同“部分”(称为楼层)的单页网站显示为单独的部分

结构是这样的:

site.com/#/floorname
site.com/#/otherfloor
site.com/#/andyetanotherfloor
诸如此类

我想做的是制作“永久链接”,这样当有人键入时:

site.com/floorname
…它将显示“site.com/#/floorname”的内容,但浏览器将显示“site.com/floorname”,而不是带有哈希的url

很抱歉,这很难理解。这可能吗?我在这里读到过hashtag是客户端的,但我想我要做的不是将指向“site.com/#/floorname”的链接重定向到“site.com/floorname”,而是相反

我找到了这个页面:

这表明domain.com/sub/parameter

可以重写为:

domain.com/sub.html#parameter
但我要做的是在没有sub.html页面的情况下重写它,然后使用域,使用以下规则:

Options +FollowSymlinks -MultiViews
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI}  !/      [NC]
RewriteCond %{REQUEST_URI}  ^/([^/]+)/? [NC]
RewriteRule .*       /#/%1           [R,NE,L]
但它不起作用

有什么建议吗

…它将显示“site.com/#/floorname”的内容,但浏览器将显示“site.com/floorname”,而不是带有哈希的url

不可能。服务器不关心
#
片段,浏览器关心。如果浏览器认为它实际上是要
/floorname
,而不是
/#/floorname
,那么客户端(assensor.js)将无法渲染,因为它看不到片段。您拥有的代码重定向浏览器,使其显示包含片段的URL,这是您必须要做的事情,无法使片段远离客户端并期望客户端正确呈现

但是,您有以下情况:

RewriteCond %{REQUEST_URI}  !/      [NC]
将始终失败,因为
%{REQUEST\u URI}
变量始终以
/
开头,因此该条件将始终为false

请尝试以下方法:

Options +FollowSymlinks -MultiViews
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/?$ /#/$1 [L,NE,R]

你可以用一些javascript来实现。下面是一个使用php+javascript的示例,但也可以使用其他语言

/.htaccess /index.php

document.location.hash='/';
.. 处理和检测哈希标记的另一个goes代码如果放低,将正常启动。

您好,这对重定向非常有效,感谢您帮助我了解/故障情况。不过我还有一个问题,有没有办法强制这些文件名使用小写?我发现可以添加重写映射将其转换为小写,但我不知道如何正确实现它。如果你能帮忙,谢谢你。如果没有,谢谢你的回答!事实上,我发现我没有足够的权限重写为小写,所以这个答案足以解决我的问题。谢谢你,乔恩@是的,你需要在vhost或服务器配置中声明一个映射,不能在htaccess中声明。
Options +FollowSymlinks -MultiViews
RewriteEngine On
RewriteBase /

## we hand the fake pages and pass them into the page via querystring
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-z\-_]+)$  index.php?load_hash=$1 [L,QSA]
<html><head>
<?php
// then on the page, preferably high in the page, we detect the GET parameter and change the hash via javascript.
if (isset($_GET['load_hash']) && !empty($_GET['load_hash'])) {
    ?>
    <script>
    document.location.hash = '/<?php echo $_GET['load_hash'];?>';
    </script><noscript>
    <a href="#/<?php echo $_GET['load_hash'];?>">Your browser has javascript disabled. Please click here.</a>
    </noscript>
    <?php
}
?>
</head>
<body>

<script>
.. your other goes code that deals with and detects the hash tag will fire as normal if placed lower.
</script>
</body></html>