.htaccess & WordPress:从 RewriteRule 中排除文件夹

Posted

技术标签:

【中文标题】.htaccess & WordPress:从 RewriteRule 中排除文件夹【英文标题】:.htaccess & WordPress: Exclude folder from RewriteRule 【发布时间】:2011-01-20 07:44:19 【问题描述】:

我在 WordPress 中有这个 .htaccess 文件。它位于 /public_html/(网络根目录)。我需要从重写引擎中排除一个文件夹(csNewsAd)。我已经尝试过这个,基于另一个类似的问题在这里 SO,但根本没有工作。

AddHandler x-httpd-php5 .php
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^/csNewsAd($|/) - [L]
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

有什么建议吗?

更多数据

/csNewsAd 内还有另一个 .htaccess 用于密码保护:


AuthName "Clasificados"
AuthType "basic"
AuthUserFile /home/ig000192/public_html/csNewsAd/.passwd
Require valid-user

【问题讨论】:

【参考方案1】:

.htaccess 会影响下面的所有目录,因此如果您在 csNewsAd 中放置一个带有所需重写指令的 .htaccess,它将优先于根文件。

【讨论】:

即使只是在您想要忽略的目录中创建一个空的 .htaccess 文件也可以解决问题。 @AndrewTibbetts,你说得对:当时不知道。【参考方案2】:

您可以添加如下内容:

RewriteCond %REQUEST_URI !^/csNewsAd 

但这不应该是必需的,因为如果 csNewsAd 确实是一个目录(文件夹),它不应该首先被重写,因为

RewriteCond %REQUEST_FILENAME !-d

您确定在您与该文件夹、权限或(实际上)另一个 .htaccess 之间没有其他任何东西吗?

【讨论】:

还有另一个 .htaccess 用于密码保护。我将代码添加到问题中。【参考方案3】:

如果您在 .htaccess 文件中使用 mod_rewrite,您只需在模式中指定不带本地路径前缀的 URL 路径。在您没有前导 / 的情况下(因为您在文档根目录 / 中):

RewriteRule ^csNewsAd($|/) - [L]

【讨论】:

@Joel Alejandro:您是否将其他规则替换为前导 /【参考方案4】:
RewriteCond %REQUEST_URI !^/(csNewsAd|csNewsAd/.*)$ 

而不是

RewriteRule ^/csNewsAd($|/) - [L] 

【讨论】:

也没有用。这很奇怪,因为这 应该 已经工作了。我开始讨厌 Wordpress,还不如尝试配置一个子域来访问这个文件夹并摆脱这个问题。 虽然没用,但我还是把这个作为公认的答案,因为它是最完整的一个。 我会尝试 Wordpress 官方论坛。过去我在这个 CMS 中遇到过一些奇怪的问题,他们解决了。如果它不起作用,请尝试在您的 .htaccess 中插入一些垃圾,看看它是否真的起作用,也许这是您安装的另一个问题。祝你好运! +1 干得好。我看了 WP MU 几个小时才回来,意识到我仍然想这样做。 请更新源链接。它会导致与问题无关的德语页面。【参考方案5】:

我第一次开始使用 Rails 做这件事。 rails .htaccess 的顶部是以下两行。

# RewriteCond %REQUEST_URI ^/notrails.*
# RewriteRule .* – [L]

当我最终效仿他们的榜样时,它奏效了。

我想排除图像、javascript、样式表、css、images-global、js-global(等),所以我将上面的内容更改为。

RewriteCond %REQUEST_URI ^(images|javascripts|stylesheets|css|images-globa|js-global|js).*
RewriteRule .* – [L]

它按我需要的方式工作。

我们不会谈论为什么我有这么多不同的 javascript、样式表和图像文件夹……。

但这确实使我的“错误”文件不那么痛苦。如果有人添加了一个不存在的图像文件,我的调度不必处理它。

【讨论】:

【参考方案6】:

遇到了同样的问题,在这里找到了我的问题的答案: http://kb.siteground.com/article/How_to_exclude_a_folder_from_Wordpress_permalinks.html

--来自网站

要从 WordPress 重写规则中排除子文件夹,您需要编辑 .htaccess 文件并更改下面的粗线:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
# RewriteRule . /index.php [L] # Original line
RewriteRule ./ /index.php [L] # New line
</IfModule>
# END WordPress

【讨论】:

试过这个,但它似乎破坏了其他非目录名称匹配的永久链接。最后,我得到了@Joel Alejandro 问题中的代码按原样工作。是否只是需要重新加载 apache 配置的问题?见developer.mindtouch.com/en/kb/…【参考方案7】:

你应该试试这个

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^/(gadget)/(.*) /gadget/$2 [R]

RewriteRule ^index\.php$ - [L]
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

【讨论】:

【参考方案8】:

我很确定您已经排除了这一点,但是由于我是为了同样的问题来到这里的,所以我想与您分享一下:在我的情况下,问题实际上在于 - 显然,不是能够访问该文件夹,排除被忽略。

【讨论】:

【参考方案9】:

将下面的行放在根目录下的 .htaccess 文件中。

ErrorDocument 401 default

遇到了完全相同的问题,这对我有用。 重定向不起作用不是问题。问题是未定义 401(需要授权)错误,因此“弹出窗口”不显示。

【讨论】:

这是对我有用的确切答案。我有一个受密码保护的子目录,当我在根目录中安装 Wordpress 时无法回答。 优秀。这对我来说也适用于排除文件夹的问题,以便它返回常规 404 而不是通过 wordpress 解析它。当然我把 401 改成了 404。 这正是我所需要的!所有其他的解决方案都不起作用!【参考方案10】:

值得注意的是,这行在 .htaccess 流中的位置很重要。

请看这里:http://tanyanam.com/technology/wordpress-exclude-directory-from-url-rewrite-with-htaccess - 该行需要在 WordPress 之前出现,在它们之后将不起作用。

罗伯

【讨论】:

【参考方案11】:

我有 GoDaddy 主机,这个问题杀死我。我一遍又一遍地遇到相同的问题,因为 public_html 中的 .htaccess 选项有冲突,而我的子目录受密码保护。

我最终购买了另一个帐户,因为我尝试对我的 .htaccess 文件进行大约一百万种不同的修改,但没有解决这个问题。我现在分享我的设置和解决方案,只是为了完整和清晰。 (只是让你知道,这个帐户无论如何都是值得的,所以没什么大不了的。)

如果它看起来像其他人的答案的组合,那是因为它是。所有这些都起作用了。

目录结构:

-otherfiles
---public_html
---.htaccess
-----subfolder
---.htaccess

子文件夹 .htaccess 有密码保护功能,类似这样:

AuthType Basic
AuthName "Attendance"
AuthUserFile "/home/user/.htpasswds/public_html/attendance/passwd"
require valid-user

public_html .htaccess 最初有这个,但它不起作用(因为它吞噬了所有东西并重定向它,因此 FatFreeFramework 或 CodeIgniter 正在处理它):

RewriteEngine On
RewriteCond $1 !^(index.php|resources|subfolder|robots.txt)
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME !-l
RewriteRule ^(.*)$ index.php?/$1 [L,QSA]

为了解决这个问题,我在 public_html .htaccess 文件中添加了两行。所以你不要猜测在哪里,我会再次显示整个文件:

RewriteEngine On
RewriteCond $1 !^(index.php|resources|robots.txt)
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME !-l
RewriteCond %REQUEST_URI !^/(subfolder|subfolder/.*)$
ErrorDocument 401 default
RewriteRule ^(.*)$ index.php?/$1 [L,QSA]

【讨论】:

【参考方案12】:

这是我关于 GoDaddy WordPress 网站的解决方案。我的安装有一个 web.config 文件,所以我添加了一个重写规则。我想要一个 /ApiData 路径,我可以在其中运行 MVC.net 应用程序(虚拟目录)以进行 AJAX 调用。

<system.webServer>
    <!-- ... -->
    <rewrite>
        <rules>
            <rule name="apidata" stopProcessing="true">
                <match url="apidata"/>
            </rule>
            <rule name="wordpress" patternSyntax="Wildcard">
                <match url="*"/>
                <conditions>
                    <add input="REQUEST_FILENAME" matchType="IsFile" negate="true"/>
                    <add input="REQUEST_FILENAME" matchType="IsDirectory" negate="true"/>
                </conditions>
                <action type="Rewrite" url="index.php"/>
            </rule>

        </rules>
    </rewrite>
</system.webServer>

【讨论】:

我将子目录中的 DNN 站点替换为根目录中的 WordPress 站点。这很完美,所以在我建立新站点时,我仍然可以看到旧的 DNN 站点。【参考方案13】:

我知道这是一篇旧帖子,但它仍然对我有所帮助。我遇到了几个 RewriteRules 块的额外问题:

##
## White listed folders
##
RewriteCond %REQUEST_URI !^/(phplist|phplist/.*)$
RewriteCond %REQUEST_FILENAME -f
RewriteCond %REQUEST_FILENAME !/.well-known/*
RewriteCond %REQUEST_FILENAME !/storage/app/uploads/.*
RewriteCond %REQUEST_FILENAME !/storage/app/media/.*
...
RewriteCond %REQUEST_FILENAME !/modules/.*/(assets|resources)/.*
RewriteRule !^index.php index.php [L,NC]

##
## Block all PHP files, except index
##
RewriteCond %REQUEST_URI !^/(phplist|phplist/.*)$
RewriteCond %REQUEST_FILENAME -f
RewriteCond %REQUEST_FILENAME \.php$
RewriteRule !^index.php index.php [L,NC]

##
## Standard routes
##
RewriteCond %REQUEST_URI !^/(phplist|phplist/.*)$
RewriteCond %REQUEST_FILENAME !-f
RewriteRule ^ index.php [L]

并且必须在每个块之前添加我的 RewriteCond...

【讨论】:

【参考方案14】:

这是排名第一的谷歌结果和错误的答案。

正确的答案是在 Wordpress 指令之前添加这个。

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %REQUEST_URI ^/subdirectoryname1/(.*)$ [OR]
    RewriteCond %REQUEST_URI ^/subdirectoryname2/(.*)$ [OR]
    RewriteRule ^.*$ - [L]
</IfModule>

【讨论】:

这可能与这个问题已有 8 年历史有关。这里之前的信息可​​能都没有用。 对,这段代码在 WP htaccess 中对我有用,在 WP 决定将 404 not found 显示到部署在上一级子目录的其他 php 程序中之前,我从来不需要这些东西【参考方案15】:

我的两个网站都遇到了类似的问题。我在这里读到的 cmets 对我不起作用,但我终于让这段代码工作了:

<IfModule mod_rewrite.c>
  RewriteEngine on

  # stuff to let through (ignore)
  RewriteCond %REQUEST_URI "/folder1/" 
  RewriteRule (.*) $1 [L]

从https://www.drupal.org/node/30334获得

【讨论】:

欢迎来到 Stack Overflow!请注意,在链接到您自己的网站时,您应该明确提及它是您的网站,否则它将作为垃圾邮件被删除。目前我已经删除了链接,因为没有它们,帖子仍然可以正常工作。【参考方案16】:

尝试使用这条规则:D 请注意,仪表板是我要排除的目录的名称,因此请根据您的需要进行更改。

RewriteRule ^(dashboard)($|/) – [L]

【讨论】:

【参考方案17】:

好像是这样的:

ErrorDocument 401 默认

在.htaccess的末尾

是正确的答案。我尝试了许多解决方案,但随后脑电波在另一个浏览器(safari)上检查它,然后清除缓存并在 chrome 上硬重新加载网站给出了积极的结果(业余错误)。该死的缓存。

在 Mac 上(在 Chrome 中),您需要“控制”点击页面上的任意位置。然后选择“检查”,这将允许您“控制”单击小圆形箭头(重新刷新按钮),它将提供选项 - 一个是“空缓存和硬重新加载”。对恢复理智非常有用。

【讨论】:

【参考方案18】:

Lukasz 的这篇文章对我有用。我在子目录中将 React 与 React Router 一起使用,并且在我修改 .htaccess 文件以在 WordPress 重写之前具有重写条件之前得到 404。

这里有 3 行:

RewriteCond %REQUEST_URI ^/MY-REACT-SUB-DIR/.*
RewriteCond %REQUEST_FILENAME !-f
RewriteRule ^.*$ /MY-REACT-SUB-DIR/index.html [L]

这是 WordPress 重写之前完整 .htaccess 代码中的这 3 行代码:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%HTTP:Authorization]
RewriteBase /
RewriteCond %REQUEST_URI ^/MY-REACT-SUB-DIR/.*
RewriteCond %REQUEST_FILENAME !-f
RewriteRule ^.*$ /MY-REACT-SUB-DIR/index.html [L]
RewriteRule ^index\.php$ - [L]
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

请务必阅读 Lakasz 的帖子,因为您可能还需要修改您的 React 应用程序: https://lukaszzagroba.com/how-to-deploy-a-react-app-in-a-subdirectory-on-a-wordpress-site/

【讨论】:

以上是关于.htaccess & WordPress:从 RewriteRule 中排除文件夹的主要内容,如果未能解决你的问题,请参考以下文章

子域“m”。与 WordPress 和。 htaccess(在 htaccess 中的重写规则冲突。)

Wordpress-htaccess访问

.htaccess 用 WordPress 插件重写

apache_conf 通过.htaccess(主.htaccess)保护wordpress网站

如何使用 .htaccess 密码保护 WordPress 博客

WordPress.htaccess访问