【问题标题】:Rewrite rule not showing slash to users & show slash for script重写规则不向用户显示斜线并为脚本显示斜线
【发布时间】:2012-09-20 04:44:40
【问题描述】:

我遇到了 CMS 创建重复项的情况。每一页都可以用斜线打开,也可以不用。

因此,我需要在物理上重写搜索引擎的每个 URL,并将 301 重定向到最后没有斜杠的条件。

但问题是脚本随后停止工作,因为它仅适用于 URL 末尾的斜杠。

我在逻辑上做了这个 .htaccess

RewriteCond %{REQUEST_URI} ^(.*)/$ [NC]
RewriteRule ^(.*)(/) $1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*[^/])$ $1/ [L]

但它正在重定向循环。请你帮我把它写正确。主要目的是让用户和 SE 看不到结尾斜杠 URL,但脚本需要在服务器内部使用结尾斜杠重写 URL。

【问题讨论】:

    标签: .htaccess mod-rewrite url-rewriting slash


    【解决方案1】:

    但它正在重定向循环。请你帮我把它写正确。主要目的是让用户和 SE 看不到结尾斜杠 URL,但脚本需要在服务器内部使用结尾斜杠重写 URL。

    如果要重定向,则需要匹配实际请求,否则,URI 会被重写,并且您的第一条规则会匹配它并重定向(一次又一次,一次又一次)。

    所以是这样的:

    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^\ ]*?)/($|\ )
    RewriteRule ^(.*)(/) $1 [R=301,L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_URI} !(.*)/$
    RewriteRule ^(.*[^/])$ $1/ [L]
    

    (只改变了第一个条件)

    【讨论】:

    • 完美运行。请你帮我读一下这是什么意思 ([^\ ]*?)/($|\ )?还有为什么我们在最后一个括号之前需要空格?
    • @user1705856 请求行可能如下所示:GET /somethingPOST /smoething HTTP/1.1([^\ ]*?) 是对任何非空格的非贪婪匹配(在 `HTTP/1.1` 位之前停止),/ 然后必须匹配尾部斜杠,($|\ ) 是结尾行或空格。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    • 2013-03-29
    • 2015-04-23
    • 2014-01-04
    • 2019-10-22
    • 1970-01-01
    相关资源
    最近更新 更多