【问题标题】:Can't rewrite a folder with .htaccess无法使用 .htaccess 重写文件夹
【发布时间】:2017-05-25 01:16:03
【问题描述】:

我最近移动了主机,但我对目录做了些微改动。我将一个文件夹从“listing”重命名为“vendors”。我使用下面的代码来防止 404 错误。

RewriteEngine On
RewriteRule ^listing/(.*) vendors/$1

这对我不起作用。我该怎么做才能解决这个问题?

旧网址:

http://www.oldsite.com/curacao/listing/chinese-culture-club/

新网址:

http://www.newsite.com/curacao/vendors/chinese-culture-club/

这是完整的 .htaccess

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^index\.php$ - [L]

# add a trailing slash to /wp-admin
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^ - [L]
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule . index.php [L]

RewriteRule ^listing/(.*) vendors/$1

# BEGIN WPSuperCache
# END WPSuperCache
# BEGIN WordPress

# END WordPress

【问题讨论】:

  • .htaccess 在哪个目录下?
  • .htaccess 的解释很可能尚未启用。
  • @arco444 在根目录中
  • @arkascha 我现在正在实习,正在从事一个 wordpress 项目。在 .htaccess 中已经有一些重写的​​代码。我对.htaccess不是很熟悉,也许我写的代码不好
  • 啊,已经有其他的重写规则了。那么很可能就是这个问题。请发布完整的.htaccess 样式文件。

标签: apache .htaccess url mod-rewrite web


【解决方案1】:
RewriteRule ^listing/(.*) vendors/$1

这似乎比 cmets 所涵盖的错误更多。首先,您的示例 URL 更改了主机/域,但这并未反映在该指令中。或者oldsite.comnewsite.com 是否托管在同一个地方(我假设它们是)。此外,您发布的是 internal rewrite,但您可能需要 external redirect 才能正确解析 404(否则您最终会得到本质上 重复的内容)。

在您现有的内部重写之前,在.htaccess 文件的顶部尝试以下操作。作为一般规则,外部重定向应该总是在内部重写之前:

RewriteCond %{HTTP_HOST} ^(www\.)?oldsite\.com [NC]
RewriteRule ^(curacao)/listing/(.*) http://www.newsite.com/$1/vendors/$2 [R=302,L]

您只需要一个RewriteEngine 指令,最好在文件顶部。 (它可以在任何地方,但在顶部更符合逻辑。)

$1 是对RewriteRule 中第一个捕获组的反向引用模式,在这种情况下它只是“curacao”,但它避免了重复。 $2 是对第二个捕获组的反向引用,就像您以前一样。

R 标志表示外部重定向替代中的绝对 URL 也可能触发外部重定向,但默认为 302) . L (last) 确保在此过程中不再处理 mod_rewrite 指令。

如果这应该是永久重定向,则将302(临时)更改为301(永久)。 301 被浏览器缓存,因此可能会导致测试出现问题。

【讨论】:

    猜你喜欢
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 2015-09-27
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多