首页 > 解决方案 > 绕过单个 Apache 重写条件,但继续处理所有其他条件

问题描述

试图帮助朋友让他的 ProcessWire 站点正常运行。htacess 中有这样一行:

# PW-PAGENAME
# ----------------------------------------------------------------------------------------------- 
# 16A. Ensure that the URL follows the name-format specification required by PW
# See also directive 16b below, you should choose and use either 16a or 16b. 
# ----------------------------------------------------------------------------------------------- 

RewriteCond %{REQUEST_URI} "^/~?[-_.a-zA-Z0-9/]*$"

他想从该单个特定条件中排除特定目录“/images/”,然后继续处理其他条件。

我尝试了很多不同的东西,但都没有奏效,但它似乎应该很简单,我应该知道该怎么做:-) 但我一辈子都想不通。

任何帮助将非常感激!

标签: apachemod-rewriteprocesswire

解决方案


RewriteCond 本身不做任何事情,它只是持有一个条件,该条件需要为真才能处理下一个 RewriteRule。.htaccess这是ProcessWire中包含的更大的摘录(没有评论):

RewriteCond %{REQUEST_URI} "^/~?[-_.a-zA-Z0-9/]*$"

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !(favicon\.ico|robots\.txt)

RewriteRule ^(.*)$ index.php?it=$1 [L,QSA]

所有的 RewriteCond 指令只限制哪些请求被重写到 ProcessWire 的index.php文件。即,ProcessWire 不会根据这些规则处理以下类型的请求:

  • 非 ASCII 路径 ( [-_.a-zA-Z0-9/]*),尽管您可以使用指令 16b来更改它。
  • 现有文件和目录 ( !-f, !-d)
  • 一些特定的文件 ( !(favicon\.ico|robots\.txt))

您需要如何修改它取决于您希望如何处理图像文件夹中的文件。

Apache 提供静态文件

如果您只想让服务器直接处理图像目录中的图像,您可能不需要更改任何内容,因为现有 RewriteConds 已经排除了文件。

也就是说,如果您不希望任何以开头的路径/images/由 ProcessWire 处理,请在 RewriteRule 之前添加另一个 RewriteCond,如下所示:

RewriteCond %{REQUEST_URI} !^/images/.*$
RewriteRule ^(.*)$ index.php?it=$1 [L,QSA]

ProcessWire 提供静态文件

如果您希望images文件夹中的图像由 ProcessWire 而不是服务器提供,则必须修改多个现有的 RewriteConds。使用仅匹配该特定路径的单独 RewriteCond 复制 RewriteRule 可能会更容易。以下指令(添加在现有 RewriteRule 后面)将重写所有以 开头的请求/images/,允许由 ProcessWire 处理。

RewriteCond %{REQUEST_URI} ^/images/.*$
RewriteRule ^(.*)$ index.php?it=$1 [L,QSA]

推荐阅读