重写哈希URL FROM /

时间:2013-11-26 00:30:02

标签: .htaccess mod-rewrite hashtag

我在这里进行了一些研究,发现主题标签是客户端的,无法使用.htaccess重写,但我认为我要做的就是反对...

我使用的是来自Kirkas.ch的Ascensor.js,它允许单页网站将不同的“部分”称为楼层,以显示为单独的部分。

结构如此:

site.com/#/floorname
site.com/#/otherfloor
site.com/#/andyetanotherfloor

等等。

我想做的是制作“永久链接”,以便当有人输入时:

site.com/floorname

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

很抱歉,如果这很难理解。这可能吗?我在这里读到主题标签是客户端的,但我认为我要做的不是将“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]

但它不起作用。

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

  

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

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

但是,你有这种情况:

RewriteCond %{REQUEST_URI}  !/      [NC]

将始终失败,因为%{REQUEST_URI}变量始终以/开头,因此该条件始终为false。

请改为尝试:

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

答案 1 :(得分:0)

你可以用一些javascript做到这一点。这是一个使用php + javascript的例子,但它可以用其他语言完成。

/。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]

的index.php

<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>