【问题标题】:.htaccess -> rewrite-strtolower doesn't work when I upload to web host.htaccess -> rewrite-strtolower 在我上传到网络主机时不起作用
【发布时间】:2017-10-05 05:23:36
【问题描述】:

好的,我再次发布一个我必须自己回答的问题,因为我在任何地方都找不到它。

我正在编写一个 .htaccess 文件来强制所有字符为小写。我找到了这个解决方案,看起来不错:

https://www.simonholywell.com/post/2012/11/force-lowercase-urls-rewrite-php/

除了文件名和变量名非常难用。我必须解决这个问题。所以我尝试制作自己的文件版本,并将文件名从“rewrite-strtolower”重命名为“lowercase”,将变量名从“rewrite-strtolower-url”重命名为“address”。我在我的家庭服务器上测试了它们,结果很漂亮:一切正常!

不幸的是,当我尝试将它们上传到我的主机时,它们不起作用。

什么?代码看起来很完美。它在我的家庭服务器上工作......为什么不是他们的?在逐行检查我的代码并确定它应该是完美的之后,我联系了我的主机并询问他们是否需要调整一些设置。

当然,他们说不,并且一位技术人员很好地运行了我运行的教程,但是当他运行它时,他的版本运行了!如何!?我将他的版本与我的版本进行了很长时间的比较,并得出结论,唯一的区别是我们使用的变量名和文件名 - 他从教程中复制了精确的文件名和变量名。

以下是我的 .htaccess 和 lowercase.php 文件的(相关)内容...你能发现我的错误吗?

.htaccess:

Options +FollowSymLinks
ErrorDocument 404 /notfound.php
<Files ~ "^\.(htaccess|htpasswd)$">
deny from all
</Files>
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} !(img|css) [NC]
RewriteCond %{REQUEST_URI} [A-Z]
RewriteCond %{REQUEST_FILENAME} !-s
RewriteRule (.*) lowercase.php?address=$1 [QSA,L]

小写.php:

<!--
Copyright (C) 2017 Peace Seeker

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  

See the GNU General Public License for more details.  
<http://www.gnu.org/licenses/>

DISCLAIMER: USER CONTENT IS LICENSED BY INDIVIDUAL CONTRIBUTORS. ONLY THE CODE STRUCTURES OF THIS FILE AND ALL MATERIALS PUBLISHED BY LUCAS MCDONALD aka AISO IPPUDU MILELE aka TRANSIENT ANIMA ARE COPYRIGHTED (i.e., COPYLEFTED) BY THIS AGREEMENT. ALL OTHER CONTENT IS OWNED BY THE CONTRIBUTORS WHO CONTRIBUTED IT.
-->

<?php
if(isset($_GET['address'])) {
    $url = $_GET['address'];
    unset($_GET['address']);
    $params = http_build_query($_GET);
    if(strlen($params)) {
        $params = '?' . $params;
    }
    header('Location: http://' . $_SERVER['HTTP_HOST'] . '/' . strtolower($url) . $params, true, 301);
    exit;
}
header("HTTP/1.0 404 Not Found");
die('Unable to convert the URL to lowercase. You must supply a URL to work upon.');
?>

这段代码在我的家庭服务器上工作,但在网络服务器上却没有工作......可能是什么问题?是否存在已弃用的语法?如果您找不到问题,请向下滚动到我的答案。 :)

【问题讨论】:

    标签: php apache .htaccess mod-rewrite url-rewriting


    【解决方案1】:

    问题实际上是评论。由于某些我仍然不知道的原因,PHP 代码之前的 HTML5 cmets 将破坏 .htaccess 在我的网络主机服务器上运行我的 lowercase.php 文件的努力,而不是在我的家庭服务器上......但是,如果我只是移动PHP代码下面的cmets,一切都很好!

    如果有人可以通过告诉我为什么 HTML5 cmets 被允许在 PHP 代码之前来改进这个答案,比如说,一个包含一堆 HTML5 代码的 .php 文件,但 有时 不允许在其中一个只有 PHP 代码的 .php 文件(或者可能不允许在将由 .htaccess 调用的 .php 文件中),我很乐意了解有关此问题的一些详细信息!

    (正如 Croises 在评论中提到的,显然 cmets 根本不能在 PHP 标头之前。我仍然不完全理解为什么......)

    【讨论】:

    • 你不能在 headers 之前发送 html 代码(如 cmets)。
    • 你知道为什么这在我的家庭服务器上有效吗?因为在我的家庭服务器版本的文件中,我在所有 PHP 代码之上都有 cmets,而且它完全响应...
    • 你可以在php之前发送html代码,但你不能在header之前。 php.net/manual/fr/function.header.php
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 2022-01-25
    相关资源
    最近更新 更多