【问题标题】:.htaccess, proper rewriting of directory and file with same name.htaccess,正确重写同名目录和文件
【发布时间】:2011-01-02 07:55:23
【问题描述】:

到目前为止,我的网站有几个静态页面,其中之一是 /portfolio。除其他外,我的 htaccess 隐藏了 .html 扩展名。我想添加一个投资组合目录,但我不想将我现有的投资组合页面作为默认索引文件移动到投资组合目录中。我的 /portfolio 页面是我的 Google 附加链接之一,我担心如果它被移动或 URL 以某种方式发生变化,Google 会认为它是一个全新的页面。

我的问题是,一旦我添加了 /portfolio/ 目录,每当我尝试访问原始 /portfolio 页面时,就会自动添加一个尾部斜杠并链接到目录本身。

我尝试了无数种选择,其中一种是将 /portfolio/ 重写为 /portfolio,但这会造成无限循环。我也尝试了“DirectorySlash Off”,但它只在目录内删除了尾部斜杠,它没有恢复对原始 /portfolio 页面的访问。

最终,我想保持我的 /portfolio 页面保持原样,像 /portfolio/example 那样链接到目录内的页面,如果 /portfolio 或 /portfolio/ 被访问,它将导致显示相同的页面不在目录之外,Google 不会认为它是重复的内容。

这里有一个类似的问题: .htaccess rewriting url to page or directory 虽然由于某种原因这仍然导致我陷入无限循环,但我猜它与隐藏的扩展有关。

这是我的 htaccess-

重写引擎开启 # HTML 到 PHP 删除处理程序 .html .htm AddType application/x-httpd-php .htm .html # 隐藏扩展 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.html -f 重写规则 ^(.*)$ $1.html # 强制万维网 RewriteCond %{HTTP_HOST} ^mydomain\.net 重写规则 ^(.*)$ http://www.mydomain.net/$1 [R=301,L] # 博客子域 RewriteCond %{HTTP_HOST} ^blog.mydomain.net$ 重写规则 ^(.*)$ http://www.mydomain.net/blog/$1 [R=301,L]

我知道拥有一个与静态页面同名的目录不是一个好主意,但我真的不希望更改现有页面并丢失 Google 附加链接,因此处理此问题的干净且正确的方法是帮助。

【问题讨论】:

    标签: .htaccess


    【解决方案1】:

    这里有两个“错误”,有两种方法可以解决它。

    首先是apache在应用重写条件之前“发现”有一个名为“portfolio”的目录。这意味着重写条件接收的是“portfolio/”而不是“portfolio”。

    其次,“!-d”规则特别避免了如果实际上存在同名目录时要进行的重写

    解决方案 1:手动重新路由对投资组合目录的请求以删除斜杠。

    # Manually re-route portfolio/ requests to portfolio
    RewriteCond %{REQUEST_FILENAME} portfolio/$
    RewriteRule ^(.*)/$ $1 
    
    # Hide extension
    RewriteCond %{REQUEST_FILENAME}\.html -f
    RewriteRule ^(.*)$ $1.html
    

    注意删除“!-d”条件。

    这样做的缺点是您必须将“投资组合”边缘案例直接硬编码到重写规则中,并且仍然会导致浏览器首先被重定向到投资组合/

    解决方案 2:设置 DirectorySlash Off 并删除目录存在测试

    # Disable Automatic Directory detection
    DirectorySlash Off
    
    # Hide extension
    RewriteCond %{REQUEST_FILENAME}\.html -f
    RewriteRule ^(.*)$ $1.html
    

    设置 DirectorySlash Off 将最好地解决此问题,但可能会破坏您实际需要自动 DirectorySlash 的站点的其他部分。祝你好运,我希望这会有所帮助。

    请注意,在测试解决方案 2 时,您的浏览器可能会记住“portfolio”到“portfolio/”的重定向,并在将请求发送到服务器之前执行重定向。请务必在缓存清除、干净的环境中进行测试以获得最佳结果。

    【讨论】:

    • 你知道,我已经试过了。我通过删除该行并删除!进行了尝试,结果没有任何变化。我会注意到我正在使用 xampp 进行测试。到目前为止,我唯一注意到的是我需要清除缓存并重新启动浏览器才能使某些更改生效,但我不确定这是否会导致解决方案不起作用。
    • 好吧,我猜我的情况没有任何真正的解决方案。我几乎忽略了这个问题,直到我去上传我的新网站时遇到它。希望到那时我能想出办法。不过感谢您的帮助。
    • 在我自己的环境中进行了一些测试后,我编辑了答案以显示您有哪些选项。
    • 哇,非常感谢,它似乎运行良好。很有趣,我很久以前就这么接近了。我尝试关闭 DirectorySlash,但无论斜线如何,它都会继续显示目录,现在我看到我所要做的就是删除“!-d”条件。我在这上面浪费了很多时间,我真的很感谢你花时间帮我解决这个问题。现在要担心的事情少了。我的博客是唯一具有实时内容的其他目录,因此我将确保指向它的所有链接都包含尾部斜杠。再次感谢。
    • 正是我需要的!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多