【问题标题】:Advence .htaccess redirect with one exceptionAdvence .htaccess 重定向有一个例外
【发布时间】:2020-11-21 01:12:33
【问题描述】:

我需要 .htaccess 重定向方面的帮助。 有很多类似的答案,但没有找到适合我的情况。

我有这个配置:

<IfModule mod_rewrite.c>
  RewriteEngine On

  # Rewrite to index.php if not file or directory
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>

现在我需要重定向所有 url,但不需要重定向 'news_list'

这适用于所有重定向:

<IfModule mod_rewrite.c>
  RewriteEngine On

  RewriteRule ^(.*)$ https://www.newsite.com/$1 [R=301,L]
</IfModule>

对于例外我应该使用: RewriteRule !^news_list($|/) https://www.newsite.com/$1 [R=301,L]

这行得通 - 'news_list' 不会重定向,但问题是,'/news_list' 不起作用(因为它需要指向 'index.php?url=news_list'。

所以我需要上面所有配置的混合,但没有运气。 提前谢谢!

【问题讨论】:

    标签: .htaccess exception redirect


    【解决方案1】:

    这可能就是你要找的:

    RewriteEngine On
    
    # Rewrite everything to new host except for /news_list...
    RewriteCond %{REQUEST_URI} !^/news_list(?:$|/)
    RewriteRule ^ https://www.newsite.com/$1 [R=301,END]
    
    # Rewrite to index.php if not file or directory
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^/?(.*)$ /index.php?url=$1 [QSA,END]
    

    最好先从 302 临时重定向开始,然后再将其更改为 301 永久重定向,前提是您确定一切都已正确设置。这样可以防止在尝试时出现缓存问题...

    如果您使用上述规则收到内部服务器错误(http 状态 500),那么您很可能操作的是非常旧版本的 apache http 服务器。在这种情况下,您将在 http 服务器错误日志文件中看到不支持的[END] 标志的明确提示。您可以尝试升级或使用较旧的 [L] 标志,在这种情况下它可能会起作用,但这取决于您的设置。

    此实现同样适用于 http 服务器主机配置或分布式配置文件(“.htaccess”文件)。显然重写模块需要在http服务器内部加载并在http主机中启用。如果您使用分布式配置文件,您需要注意在主机配置中完全启用它的解释,并且它位于主机的 DOCUMENT_ROOT 文件夹中。

    一般来说:您应该始终喜欢将此类规则放在 http 服务器主机配置中,而不是使用分布式配置文件(“.htaccess”)。这些分布式配置文件增加了复杂性,通常是意外行为的原因,难以调试,而且它们确实减慢了 http 服务器的速度。它们仅在您无法访问真正的 http 服务器主机配置(阅读:非常便宜的服务提供商)或坚持编写自己的规则的应用程序(这是一个明显的安全噩梦)的情况下作为最后一个选项提供。

    【讨论】:

    • 感谢您的帮助和所有提供信息。我尝试代码,但它总是重定向到 www.newsite.com 我尝试使用 302 和 301。同时我在 index.php 中创建此重定向 :) 现在它可以工作,但它是丑陋的解决方案。再次 Tnx 获取所有信息 - 我将研究您的代码并进行更多测试。我们有这种不好的做法来解决 .htaccess 中的这类问题 - 我猜是因为缺乏知识。
    • 我从您的问题中了解到,您确实想要将所有内容重定向到新主机名。除了https://oldsite.com/news_list/something 之外,应该应用重定向到/index.php。那不是的情况吗?然后你需要修改你的问题,以便其他人能够理解你实际上想要什么。
    • 您理解正确 - 我想将所有内容重定向到新主机名,但不是 oldsite.com/news_list/somethingoldsite.com/news_list 但解决方案重定向所有站点(包括 https.../news_list/something):)
    • 不,抱歉。上述解决方案not 将请求重定向到/news_list...。如果它对你有用,那么你要么实现了上面显示的内容,要么有另一个重定向规则,或者你只是在缓存的结果中使用。考虑一下我写的关于重定向的 http 状态 301 的危险......
    • 奇怪。也许还有更多(服务器上的一些愚蠢配置,我无权访问)。非常感谢您的所有帮助。
    猜你喜欢
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 2013-04-28
    • 2013-04-25
    • 1970-01-01
    • 2022-10-21
    • 2014-09-11
    • 1970-01-01
    相关资源
    最近更新 更多