Apache 如何使用IF-in-htaccess设置某些URL的状态代码

Apache 如何使用IF-in-htaccess设置某些URL的状态代码,apache,.htaccess,http-headers,apache2.4,response-headers,Apache,.htaccess,Http Headers,Apache2.4,Response Headers,我有类似的URLhttps://example.com/page/1234/ 和https://example.com/page/9876/. 对于这些URL,我希望通过htaccess Apache 2.4设置某些状态代码 我试着和你一起做 <If "%{REQUEST_URI} =~ (1234|9876)\/$"> Header set Status "HTTP/1.1 410 Gone" </If> 但我似乎在代码

我有类似的URLhttps://example.com/page/1234/ 和https://example.com/page/9876/. 对于这些URL,我希望通过htaccess Apache 2.4设置某些状态代码

我试着和你一起做

<If "%{REQUEST_URI} =~ (1234|9876)\/$">
    Header set Status "HTTP/1.1 410 Gone"
</If>
但我似乎在代码中有一个错误,因为我不认为新的状态代码是开发人员工具中的响应。如何以正确的方式进行


PS:我不能使用“重写规则”-这种设置410触发ErrorDocument,这是我不想要的。对于这两个URL,我只想设置状态代码。对于以本机方式获取410的其他URL,应触发ErrorDocument。

您可以将此块与使用默认ErrorDocument 410的表达式一起用于特定URL模式:

重新启动发动机 仅适用于上述URL禁用错误文档 ErrorDocument 410默认值 设置状态=410 重写规则[L,G]
您可以将此块与将默认ErrorDocument 410用于特定URL模式的表达式一起使用:

重新启动发动机 仅适用于上述URL禁用错误文档 ErrorDocument 410默认值 设置状态=410 重写规则[L,G]
有了您展示的样品,请尝试以下内容。请在测试URL之前清除浏览器缓存

RewriteEngine ON
RewriteRule ^page/(1234|9876)/?$ - [NC,R=410,L]

有了您展示的样品,请尝试以下内容。请在测试URL之前清除浏览器缓存

RewriteEngine ON
RewriteRule ^page/(1234|9876)/?$ - [NC,R=410,L]
您是否想要应用程序生成的正常页面响应,但状态为410 HTTP? 100%正确:正常页面,但响应状态410消失

在Apache中触发410响应将始终提供适当的Apache ErrorDocument。您可以做的是将410 ErrorDocument本身设置为相同的URL,并以通常的方式触发410响应。但是,我们需要小心不要创建重写循环

例如:

<If "%{REQUEST_URI} =~ m#^/page/(1234|9876)/$# && %{ENV:REDIRECT_STATUS} == ''">
    # Capture the URL-path after the slash prefix
    SetEnvIf Request_URI "^/(.+)" REL_URL_PATH=$1

    # Dynamic ErrorDocument to the same as the requested URL
    # The slash prefix in the directive is necessary to be seen as a local URL-path
    ErrorDocument 410 /%{reqenv:REL_URL_PATH}

    # Trigger 410 Gone
    RewriteRule ^ - [G]
</If>
<If "%{REQUEST_URI} =~ m#/(1234|9876)/$#">
    Header set Status "HTTP/1.1 410 Gone"
</If>
SetEnvIf Request_URI "/(1234|9876)/$" GONE=1
Header set Status "HTTP/1.1 410 Gone" env=GONE
以上内容与任何以/1234/或/9876/结尾的URL匹配。或者,为了更具体地匹配整个URL,请使用m^/page/1234 | 9876/$。这使用了另一种语法来分隔正则表达式ie.m,而不是使用斜杠ie.//,以避免在模式中转义斜杠

或者,您不需要Apache表达式,可以使用SetEnvIf并根据环境变量有条件地设置头

例如:

<If "%{REQUEST_URI} =~ m#^/page/(1234|9876)/$# && %{ENV:REDIRECT_STATUS} == ''">
    # Capture the URL-path after the slash prefix
    SetEnvIf Request_URI "^/(.+)" REL_URL_PATH=$1

    # Dynamic ErrorDocument to the same as the requested URL
    # The slash prefix in the directive is necessary to be seen as a local URL-path
    ErrorDocument 410 /%{reqenv:REL_URL_PATH}

    # Trigger 410 Gone
    RewriteRule ^ - [G]
</If>
<If "%{REQUEST_URI} =~ m#/(1234|9876)/$#">
    Header set Status "HTTP/1.1 410 Gone"
</If>
SetEnvIf Request_URI "/(1234|9876)/$" GONE=1
Header set Status "HTTP/1.1 410 Gone" env=GONE
您是否想要应用程序生成的正常页面响应,但状态为410 HTTP? 100%正确:正常页面,但响应状态410消失

在Apache中触发410响应将始终提供适当的Apache ErrorDocument。您可以做的是将410 ErrorDocument本身设置为相同的URL,并以通常的方式触发410响应。但是,我们需要小心不要创建重写循环

例如:

<If "%{REQUEST_URI} =~ m#^/page/(1234|9876)/$# && %{ENV:REDIRECT_STATUS} == ''">
    # Capture the URL-path after the slash prefix
    SetEnvIf Request_URI "^/(.+)" REL_URL_PATH=$1

    # Dynamic ErrorDocument to the same as the requested URL
    # The slash prefix in the directive is necessary to be seen as a local URL-path
    ErrorDocument 410 /%{reqenv:REL_URL_PATH}

    # Trigger 410 Gone
    RewriteRule ^ - [G]
</If>
<If "%{REQUEST_URI} =~ m#/(1234|9876)/$#">
    Header set Status "HTTP/1.1 410 Gone"
</If>
SetEnvIf Request_URI "/(1234|9876)/$" GONE=1
Header set Status "HTTP/1.1 410 Gone" env=GONE
以上内容与任何以/1234/或/9876/结尾的URL匹配。或者,为了更具体地匹配整个URL,请使用m^/page/1234 | 9876/$。这使用了另一种语法来分隔正则表达式ie.m,而不是使用斜杠ie.//,以避免在模式中转义斜杠

或者,您不需要Apache表达式,可以使用SetEnvIf并根据环境变量有条件地设置头

例如:

<If "%{REQUEST_URI} =~ m#^/page/(1234|9876)/$# && %{ENV:REDIRECT_STATUS} == ''">
    # Capture the URL-path after the slash prefix
    SetEnvIf Request_URI "^/(.+)" REL_URL_PATH=$1

    # Dynamic ErrorDocument to the same as the requested URL
    # The slash prefix in the directive is necessary to be seen as a local URL-path
    ErrorDocument 410 /%{reqenv:REL_URL_PATH}

    # Trigger 410 Gone
    RewriteRule ^ - [G]
</If>
<If "%{REQUEST_URI} =~ m#/(1234|9876)/$#">
    Header set Status "HTTP/1.1 410 Gone"
</If>
SetEnvIf Request_URI "/(1234|9876)/$" GONE=1
Header set Status "HTTP/1.1 410 Gone" env=GONE

不,我不能这样做,因为这种文件会触发错误。但是我只想设置状态代码。设置状态代码与使用R=…相同。我测试了这个行为,它按照我所描述的工作。我确实需要一份文件,但这两种情况下不需要。对于这两个URL,我只想设置状态代码。ErrorDocument 410 Default将显示服务器自己的410页,对吗?这是我想要避免的。好的,请检查我更新的答案。它将410设置为触发ErrorDocument Handling的匹配模式不,我不能这样做-因为这种类型会触发ErrorDocument。但是我只想设置状态代码。设置状态代码与使用R=…相同。我测试了这个行为,它按照我所描述的工作。我确实需要一份文件,但这两种情况下不需要。对于这两个URL,我只想设置状态代码。ErrorDocument 410 Default将显示服务器自己的410页,对吗?这是我想要避免的。好的,请检查我更新的答案。它为匹配模式设置410,并触发ErrorDocument Handling。对于这两个URL,我只想设置状态码-您希望或希望在响应正文中返回什么?您是否希望应用程序生成正常的页面响应,但状态为410 HTTP?Aisde:但我似乎在代码中有一个错误,因为我没有将新的状态代码视为响应-发布的代码在语法上无效-您应该看到500个内部服务器错误@MrWhite 100%正确:正常页面,但响应状态为410Gone@MrWhite看不到500:但也看不到410-只看到通常的200页你应该检查你的错误日志。如果您发布的内容没有抛出可见错误,那么我会认为您不在Apache上?可能
LiteSpeed??对于这两个URL,我只想设置状态代码-您希望或希望在响应正文中返回什么?您是否希望应用程序生成正常的页面响应,但状态为410 HTTP?Aisde:但我似乎在代码中有一个错误,因为我没有将新的状态代码视为响应-发布的代码在语法上无效-您应该看到500个内部服务器错误@MrWhite 100%正确:正常页面,但响应状态为410Gone@MrWhite看不到500:但也看不到410-只看到通常的200页你应该检查你的错误日志。如果您发布的内容没有抛出可见错误,那么我会认为您不在Apache上?也许LiteSpeed??更新/重写了答案,并提供了可行的解决方案。不过,这感觉有点骇客。在我的测试中,如果我只向htaccess添加规则头集状态HTTP/1.1 410 Gone,而没有任何条件,它的工作原理与我预期的一样:此目录中的所有URL都会删除头410,但仍然可用。ErrorDocument不会触发。它的工作原理与我预期的一样-在这种情况下,这对于您的服务器配置来说似乎是相当独特的,因为它只设置了一个Status HTTP response header,实际上并没有像我的回答中提到的那样在请求上设置HTTP响应代码,所以肯定还有其他东西可以做到这一点。如果这对你有效,那么我已经用另一种解决方案更新了我的答案,修复了你问题中的代码,并添加了进一步的解释。你最近的更新与我的想法100%一致——我甚至测试了它,但经常在语法上失败……用可行的解决方案更新/重写了答案。不过,这感觉有点骇客。在我的测试中,如果我只向htaccess添加规则头集状态HTTP/1.1 410 Gone,而没有任何条件,它的工作原理与我预期的一样:此目录中的所有URL都会删除头410,但仍然可用。ErrorDocument不会触发。它的工作原理与我预期的一样-在这种情况下,这对于您的服务器配置来说似乎是相当独特的,因为它只设置了一个Status HTTP response header,实际上并没有像我的回答中提到的那样在请求上设置HTTP响应代码,所以肯定还有其他东西可以做到这一点。如果这对你有效,那么我已经用另一种解决方案更新了我的答案,修复了你问题中的代码,并添加了进一步的解释。你最近的更新与我的想法完全一致-我甚至测试了它,但经常在语法上失败。。。