【问题标题】:URL rewrite to remove trailing folder nameURL 重写以删除尾随文件夹名称
【发布时间】:2014-12-07 00:09:49
【问题描述】:

我们有一台服务器,在 /var/www/ 文件夹下有几个文件夹。 我们已经将我们的域名指向了服务器的 IP,并且默认情况下我们希望加载一个文件夹作为网站(因为无法使用 DNS 指向一个文件夹)。

我已经编写了 .htaccess,这样当您输入 IP 或域名时,请求会重定向到网站文件夹。

但是,每当我们输入 IP 或域名时,都会将文件夹名称添加到 URL 中。

这是当前的 .htaccess:

Options +FollowSymlinks -Multiviews
    #DirectoryIndex folder/
    RewriteEngine on
    ReWriteBase /
    RewriteRule ^$ /folder [L]
    RewriteRule ^$ folder/
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+folder/([^\s]+) [NC]
    RewriteRule ^ %1 [R=301,L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule (?!^folder/)^(.*)$ /folder/$1 [L,NC]

文件夹是文件夹的网站 所以,

www.domain.com

变成

www.domain.com/folder/

有没有办法重写 URL 以删除文件夹名称?

提前致谢:)

编辑:添加 .htaccess 代码

【问题讨论】:

  • 当您输入 www.domain.com 时,您的异常结果是什么?
  • 并显示到目前为止您的重写规则
  • 我们不能不看看你现在的规则
  • @anubhava 我刚刚在当前规则中添加。请看一下:)
  • @RahilWazir 我现在已经在问题的现行规则中添加了

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


【解决方案1】:

DocumentRoot/.htacess 中有这样的规则:

DirectorySlash On
Options +FollowSymlinks -MultiViews
RewriteEngine on
ReWriteBase /

# redirect /folder/abc123 to /abc123
RewriteCond %{THE_REQUEST} \s/+folder/(\S*) [NC]
RewriteRule ^ /%1 [R=301,L,NE]

# skip rewrites for real files/directories
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule !^(index\.)?$ - [L]

# route everything internally to /folder
RewriteRule ^((?!folder/).*)$ folder/$1 [L,NC]

【讨论】:

  • 除非您提供详细信息,否则该评论将无济于事。你试过什么网址? .htaccess 位于何处?是在/folder/ 里面还是在它上面的一层?这个 .htaccess 中是否还有更多规则?
  • 嗨@anubhava,感谢您的回答。我在文档根目录 (/var/www/) 中有我的 .htaccess。我尝试了 www.domain.com,它加载了一个页面,其中列出了 documentroot 下的所有文件和文件夹。要求当我键入 www.domain.com 时,应加载 www.domain.com/folder,但 URL 应显示 www.domain.com。当我输入 www.domain.com/folder2 时,应该显示 www.domain.com/folder2 但 URL 不需要重写
  • 非常感谢您的回复:D。这解决了问题。
  • 您能解释一下这里发生了什么吗? :)
【解决方案2】:

听起来您进行了外部重定向而不是内部重写。外部重定向由 [R] 标志(带有可选参数)表示,并导致 Apache 使用客户端应请求的不同 URL 将 301 或 302 标头发送回客户端。这会导致客户端在地址栏中显示新的 url。

您想要的是内部重写。当你请求 url 时,url 在内部会被重写到资源实际所在的位置。为此,您可以省略[R] 标志,并且在重写部分不使用域名。它通常看起来像这样:

RewriteCond %{REQUEST_URI} !^/folder
RewriteRule ^(.*)$ /folder/$1 [L]

【讨论】:

  • 我尝试在htaccess末尾添加此代码,但它仍然没有重写URL以隐藏文件夹名称
  • 你尝试了什么网址,观察者的行为是什么。预期的行为是什么?
  • 我在我的 htaccess 文件末尾附加了您的代码。观察到的行为是当前行为,即 www.domain.com 从 www.domain.com/folder 加载内容,但 URL 显示 www.domain.com/folder。期望 URL 显示 www.domain.com,但显示来自 www.domain.com/folder 的内容。谢谢你的回复:)
  • 从规则中删除其余部分,然后清除缓存并重试。该规则不应导致该行为。如果您仍然看到此行为,您是否使用了可能导致此重定向的框架?我现在无法真正调查它,因为我现在需要去某个地方。
  • 我也做了同样的事情,但是该请求会在发出的任何请求中添加一个“/文件夹”。例如,如果我创建一个 www.domain.com/website1,该 URL 会加载一个 www.domain.com/folder/website1,并且由于该 URL 不存在,因此会引发错误。
猜你喜欢
  • 2016-08-29
  • 2013-07-18
  • 2013-12-09
  • 2011-05-03
  • 2020-06-16
  • 2014-04-22
  • 1970-01-01
  • 2018-05-25
  • 1970-01-01
相关资源
最近更新 更多