【问题标题】:How to redirect all urls within a directory to a hashed version of the same url?如何将目录中的所有 url 重定向到相同 url 的散列版本?
【发布时间】:2014-12-29 13:00:03
【问题描述】:

这就是我想要实现的目标。

用户点击一个链接或在地址栏中输入类似http://test.com/projects/a-project的内容

页面被重定向到http://test.com/projects/#a-project

projects子目录下存在多个项目。

到目前为止,这是我的 htaccess

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteRule /?projects/(.*)$ /projects/#$1 [L,R,NE]

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

http://htaccess.madewithlove.be/ 上测试时效果很好,但在我的网站上会导致重定向循环。

有什么想法吗?

【问题讨论】:

    标签: .htaccess redirect


    【解决方案1】:

    您有一个无限循环,因为 htaccess 看不到主题标签(它只是客户端)。
    所以你的规则被一次又一次地执行。

    相反,您可以使用此代码

    # BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On
    
    RewriteCond %{THE_REQUEST} \s/projects/([^\s]+)\s [NC]
    RewriteRule ^ /projects/#%1 [R,L,NE]
    
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>
    # END WordPress
    

    注意:{THE_REQUEST} 用于确保请求不是来自内部重定向,而是来自原始请求(客户端请求)。所以在这段代码中,只有当它来自客户端请求时才会重定向到#(而不是之后,这会导致无限循环)。


    编辑:解决您的 ajax 问题

    # BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On
    
    RewriteCond %{THE_REQUEST} \s/projects/([^\s]+)\s [NC]
    RewriteCond %{QUERY_STRING} !^ajax=true$ [NC]
    RewriteRule ^ /projects/#%1 [R,L,NE]
    
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>
    # END WordPress
    

    Ajax 调用:http://test.com/projects/a-project?ajax=true
    普通(用户)调用:http://test.com/projects/a-project(重定向到 # 等效项)

    【讨论】:

    • 是的,这很有效,但它弄乱了我正在发出的一些 ajax 请求。关于如何防止它为ajax重写的任何想法?你还愿意解释一下你做了什么吗?
    • 我添加了一个注释来解释什么是{THE_REQUEST}。对于您的 ajax 问题,您可以使用一些技巧来避免它。你在使用 POSTGET 与 ajax 吗?
    • 感谢您的解释。我正在使用 GET。
    • 该死...还有另一种可能性:将 GET 参数添加到 ajax 调用部分(例如 ajax=true),甚至在 url 中添加 /ajax/ 部分并将上面的规则修改为不在这种情况下重定向
    • 我没有在评论中解释它,而是编辑了我的答案以便更容易理解
    猜你喜欢
    • 2016-06-02
    • 2016-11-30
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 2022-11-27
    • 2018-02-22
    • 2013-10-27
    相关资源
    最近更新 更多