.htaccess mod_rewrites在尾部斜杠上

时间:2017-09-30 14:32:59

标签: wordpress apache .htaccess mod-rewrite

我无法在我的.htaccess中找到这个看似mod_rewrite问题的来源,以便进行多站点WordPress安装。

问题在于,当我尝试直接在地址栏中输入页面时(例如example.com/page),它会将我重定向到wp-login.php脚本/页面。

如果我先加载example.com,请先键入尾部斜杠和页面(例如example.com,然后添加/page并按Enter键),它就可以了。

我已将此问题移交给我的网络托管团队,他们无法解决问题。我之前也曾在网络托管工作。

该站点当前不是“主域”,但它的所有文件都在主根的子目录中(例如parent/public_html/subdir),但它在自己的域和文档根目录中。这是站点1,博客2(在wp-config.php和DB中)。

WordPress多站点安装加载其他所有内容。

这是我的.htaccess

## EXPIRES CACHING ##
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/pdf "access plus 1 month"
ExpiresByType text/x-javascript "access plus 1 month"
ExpiresByType application/x-shockwave-flash "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 year"
ExpiresDefault "access plus 2 days"
</IfModule>
## EXPIRES CACHING ##


RewriteCond %{SERVER_PORT} 80
RewriteCond %{HTTP_HOST} ^domain\.tld$ [OR]
RewriteCond %{HTTP_HOST} ^www\.domain\.tld$
RewriteRule ^(.*)$ https://www.domain.tld/$1 [R,L]

RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]

# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]


# Wordfence WAF
<Files ".user.ini">
<IfModule mod_authz_core.c>
    Require all denied
</IfModule>
<IfModule !mod_authz_core.c>
    Order deny,allow
    Deny from all
</IfModule>
</Files>

# END Wordfence WAF

1 个答案:

答案 0 :(得分:0)

  

当我使用尾部斜杠(例如/page/)加载它时,它可以正常工作;当我在菜单中加载它时,它加载斜杠。当我只输入没有尾部斜杠时,[它不起作用]。

你错过了问题中的尾随斜线,这使得这个问题更难以理解。

要在所有WordPress网址上强制使用尾部斜杠,您可以尝试在 WordPress前端控制器之前立即添加以下指令。

RewriteRule !./$ %{REQUEST_URI}/ [R=302,L]

请注意,这是302(临时)重定向。只有当您确定它正常工作时才将其更改为301(永久)重定向。 301s被浏览器缓存,因此可能会使测试出现问题。

这应该在这里:

# Prevent further processing for existing files/directories
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

# >>> HERE <<<

# Front controller
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]

如果您只需要申请特定主机,则添加条件以检查此情况。例如:

RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule !./$ %{REQUEST_URI}/ [R=302,L]
  

我已经读过最好将末尾的斜线硬编码,因为它可以加速broswer。

这仅适用于物理目录,而不适用于WordPress网址。对于WP URL(或任何其他类型的虚拟 URL),它没有区别,只是个人偏好。 (FWIW,除非直接链接到文件系统目录,否则我不希望使用尾部斜杠。)

对于物理目录,Apache(mod_dir)将发出301重定向以附加尾部斜杠。这是必要的,以便能够从该目录提供目录索引(例如index.php)。因此,为了避免额外的重定向,您应该链接到带有斜杠的目录。