【问题标题】:Simple .htaccess rewrite not working on GoDaddy简单的 .htaccess 重写在 GoDaddy 上不起作用
【发布时间】:2015-09-02 02:57:29
【问题描述】:

我的公司目前被 GoDaddy 卡住了,我的 .htaccess 重写无法正常工作。这在我的本地主机上运行良好。

目的是让 example.com/about 实际获得 example.com/about.php,而 URL 仍然只显示 example.com/关于

这是我的 .htaccess 文件:

Options +FollowSymlinks -MultiViews -Indexes

RewriteEngine on

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php [QSA,L]

我已阅读有关 GoDaddy 服务器不一致的 .htaccess 行为的所有其他帖子。我确实让他们确认 mod_rewrite 已启用,并且我的 PHP 是 5.4.19。希望有人已经经历过这件事,或者可以提供一些启示......

【问题讨论】:

  • 我认为问题是在 GoDaddy 上没有多少工作......
  • 我同意他们很糟糕,并计划抛弃他们。不幸的是,现在不是迁移我整个公司的电子邮件和网络托管的时候。我只是想让这个 URL 重写暂时起作用。

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


【解决方案1】:

第 1 步:检查 GoDaddy 服务器使用的是 IIS 还是 apache?

  • 转到 plesk 面板
  • 点击左侧菜单中的网站和域
  • 查找 IIS 设置

IIS Settings

第2步:如果服务器使用IIS,需要使用Web.config文件而不是.htaccess文件

示例 Web.config 文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
 <system.webServer>
    <rewrite>
        <rules>
            <clear />
            <rule name="Rewrite to index.php" stopProcessing="true">
                <match url="^(.*)$" />
                <conditions>
                    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                    <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                </conditions>
                <action type="Rewrite" url="/indus-admin/index.php?page={R:1}" appendQueryString="true" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>

【讨论】:

    【解决方案2】:

    您的服务器必须是 Linux 才能使 .htaccess 工作。在 GoDaddy 服务器上,它仅适用于 Linux 托管,而不适用于 Windows 托管。对于 Windows 主机,您必须配置 web.cong 以启用重写规则。

    【讨论】:

    • 什么是 web.cong?
    • 请详细说明。我在 Linux Hosting 上,但它不工作。
    【解决方案3】:

    在 GoDaddy help page 关于这个主题,它说

    包含重写规则的 .htaccess 文件必须与目标文件位于同一目录中。

    因此,请尝试将单独的 .htaccess 文件放在您重写 url 的每个目录中。

    【讨论】:

      【解决方案4】:

      因为大多数网站都在 .php 或 .html 中

      RewriteEngine on 
      RewriteCond %{REQUEST_FILENAME} !-d 
      RewriteCond %{REQUEST_FILENAME}\.php -f 
      RewriteRule ^(.*)$ $1.php
      
      RewriteEngine on
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteCond %{REQUEST_FILENAME}\.html -f
      RewriteRule ^(.*)$ $1.html
      

      【讨论】:

        【解决方案5】:

        谢谢。 在 GD 支持让我头疼了一个星期后,这也帮助了我

        为了让我的 Subdreamer(是的,我知道,呃)网站仍然有友好的 URL 工作,我进行了以下修改

        RewriteEngine On
        RewriteBase /
        RewriteRule ^/?$ /1 [L]
        
        Options -MultiViews                
        
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^(.*) index.php
        

        祝大家好运

        【讨论】:

          【解决方案6】:

          我终于想通了。再次感谢所有花时间提供帮助的人。在我的主机帐户的根目录中还有另一个 .htaccess 文件导致了 500 错误,我将其删除。然后我遇到了一个 400 错误,我可以使用 RewriteBase 解决这个错误。这是工作的 .htaccess 文件:

          RewriteEngine On
          RewriteBase /this_sites_subdirectory/
          RewriteRule ^/?$ /1 [L]
          
          Options -MultiViews                
          
          RewriteCond %{REQUEST_FILENAME}.php -f
          RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php 
          

          【讨论】:

          • 您遗漏了非常重要的细节,因为如果您使用的是更改规则的子目录。在您的示例中,假设它位于根目录中。请务必在提问时提供您的确切问题,而不是 general 示例。
          • 点得好;下次我会努力提供更多细节。我的示例中的 URL 准确地显示了这个特定站点的根级别,我的文件实际上在哪里。我不知道我的主机帐户上其他地方的 .htaccess 文件,在链接到该域根目录的文件夹之外,会影响该站点。这是我在这里学到的主要内容。
          【解决方案7】:

          这已经出现了好几次了——GoDaddy 就是这些问题的代名词。我推荐以下:

          首先,将其放在 .htaccess 文件的顶部:

          RewriteEngine On
          
          # Remove php extension from the request by means of a redirect.
          # This should really be for php files that exist
          RewriteCond %{REQUEST_FILENAME} -f
          RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
          RewriteRule ^ /%1 [R,L,NC]
          

          然后在上述操作之后尝试一个

          # 1. Map the request to a PHP file, if one exists
          RewriteCond %{REQUEST_FILENAME}.php -f
          RewriteRule ^ %{REQUEST_URI}.php [L]
          
          # 2. Map the request to a PHP file, if one exists (alternative method)
          RewriteCond %{REQUEST_FILENAME}.php -f
          RewriteRule ^(.*)$ /$1.php [L]
          
          # 3. Map the request to a PHP file, provided the request is not
          #    a file or a directory. The PHP file in question does not need
          #    to exist on the file system.
          RewriteCond %{REQUEST_FILENAME} !-f    
          RewriteCond %{REQUEST_FILENAME} !-d    
          RewriteRule ^(.*)$ /$1.php [L]    
          

          手头的问题可能与Options 指令有关。根据过去的经验,它通常来自在该指令中使用 Includes - 我知道 GD 不允许这些。但是,您并没有使用它们,因此请尝试以下任意组合以查看是否没有出现 500 错误。

          Options +FollowSymLinks -Multiviews
          
          Options +FollowSymLinks
          
          Options -Multiviews
          

          GD 默认关闭Indexing,因此没有必要在Options 指令中使用它。

          旁注:您可能已经知道这一点,但不要在 GD 主机上的 .htaccess 文件中使用 php_valuephp_flag。相反,您需要创建一个 php5.ini 文件,其中设置了值和标志。

          更新:我已删除 RewriteBase(因为它已知会导致某些用户出现问题)并相对于域的根目录进行重定向/重写。

          【讨论】:

          • 迈克,感谢您非常彻底的回复。我已经尝试了上述代码+选项的所有组合,但是我得到的只是 500 错误。我绝对将此归咎于 GoDaddy。如果他们的技术支持无法解决这个问题,我会敦促我的公司尽快离开他们。我们每年花费 3-4k 美元与一群用户和许多域进行托管交换,这就是他们为我们提供的服务:(
          • 我一直在寻找解决这个问题的方法,这是第一个对我有用的方法。谢谢!
          【解决方案8】:

          你应该简化你的规则。 Go Daddy 很烦人,但这应该可以。

          RewriteEngine on
          RewriteBase /
          RewriteCond %{REQUEST_FILENAME} !-d
          RewriteCond %{REQUEST_FILENAME} !-f
          RewriteRule ^([^/]+)/?$ /$1.php [L]
          

          【讨论】:

          • 感谢您的帮助。但是,我仍然收到 500 内部服务器错误 :(
          • 尝试删除这个+FollowSymlinks
          • 您是否收到 500 错误?您有权访问您的日志吗?尝试删除整个 Options 行,看看您仍然收到什么消息。
          • 之前只是一个 500 错误。现在删除选项行会产生“未找到”错误,并附加 500 错误。
          • 我真的很讨厌 GD。无论如何,尝试更新,看看是否有帮助。否则看看你能不能得到你的日志。
          猜你喜欢
          • 2017-10-06
          • 1970-01-01
          • 1970-01-01
          • 2018-02-09
          • 1970-01-01
          • 2023-03-27
          • 1970-01-01
          • 2013-01-27
          • 1970-01-01
          相关资源
          最近更新 更多