设置.htaccess规则以指定不同的文件夹

时间:2016-12-24 09:56:46

标签: php apache .htaccess

我想在.htaccess中设置一个规则,如果我输入网址www.mydomain.com/compare.php set' public_html'作为root用户,否则任何内容都会在URL中设置为' public'夹。

var player: AVAudioPlayer?

    let url = Bundle.main.url(forResource: "Sound/yatch", withExtension: "mp3")!

    do {
        player = try AVAudioPlayer(contentsOf: url)
        guard let player = player else { return }

        player.prepareToPlay()
        player.play()
    } catch let error {
        print(error.localizedDescription)
    }

我希望获得以下结果。

如果网址 www.mydomain.com/compare.php 点击以下文件。

RewriteRule ^(?!compare-source.php).*)$ public/$1 [L]

如果网址 www.mydomain.com / www.mydomain.com/home 等,请点击以下文件。

public_html/compare.php

我在正则表达式中很弱,在这些apache规则中总是:-(有人可以给我一个描述良好的解决方案吗?

欢迎您的回答,请您详细说明这些疯狂的事情是如何运作的。感谢。

2 个答案:

答案 0 :(得分:1)

尝试:

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/public
RewriteRule ^((?!compare\.php).*)$ /public/$1 [L]

RewriteEngine指令启用或禁用运行时重写引擎。

RewriteCond指令定义规则条件。以下规则仅在满足此条件时使用;在我们的示例中,如果REQUEST_URI(请求的URL的路径组件)没有(因为!)开始(因为^/public。我们需要这个条件,因为我们不想重写已经重写的URL - 这会导致循环和内部错误500.

最后,RewriteRule将匹配正则表达式模式^((?!compare\.php).*)$)与主机名和端口之后的部分URL匹配,并且没有前导斜杠。如果模式匹配,则替换(public/$1)将替换原始URL路径。

简单来说,如果网址路径不以compare.php开头(因为?!),请选择开头(.*)和结束之间的所有内容(^$)并将其放在变量$1中。然后将原始网址路径替换为/public/$1

@Anubhava的答案也是正确的,他只是在RewriteRule中放置了这两个条件,并且它可以写成更具可读性:

RewriteCond %{REQUEST_URI} !^/public
RewriteCond %{REQUEST_URI} !^/compare\.php
RewriteRule ^(.*)$ /public/$1 [L]

答案 1 :(得分:1)

您可以在站点根目录中使用此.htaccess:

RewriteEngine On

# route /home/ or /home to /
RewriteRule ^home/?$ / [L,NC]

# if not compare-source.php or public/* then route to /public/*
RewriteRule ^(?!public/|compare-source\.php$).*)$ public/$1 [L,NC]