Dot-Htaccess

RewriteRules 不以 LAST 標誌停止?

  • June 26, 2019

我似乎在使用 Apache 2.2 的 Rewrite 模組(在 FreeBSD 8 上執行)時遇到了問題。我的.htaccess文件如下:

Options -Indexes

RewriteEngine on
RewriteRule ^xpaste$ cross.php [L]
RewriteRule ^x([a-f0-9]*)$ cross.php?id=$1 [L]
RewriteRule ^(gen|[a-f0-9]+)$ index.php?$1 [L]
RewriteRule ^(.*)$ index.php [L] 

然而不知何故,最後一條規則覆蓋了其他三個規則。一旦我將其註釋掉,其他規則就會按預期工作:

  • www.example.com/xpaste打開cross.php
  • www.example.com/x132633打開cross.php?id=132633
  • www.example.com/gen打開index.php?gen

我在每個 上嘗試了、 和標誌的各種組合L,但除非我註釋掉最後一條規則,否則一切都會被定向到. 一旦找到匹配項,如何讓 Apache 停止處理s?NS``S=n``RewriteRule``index.php``RewriteRule

RewriteRule 生成一個 INTERNAL REDIRECT,然後從第一個 RewriteRule 開始重複處理(RewriteRule ^xpaste$ cross.php

$$ L $$)。您需要在最後一個 RewriteRule 之前添加 RewriteCond:

RewriteEngine on
RewriteRule ^xpaste$ cross.php [L]
RewriteRule ^x([a-f0-9]*)$ cross.php?id=$1 [L]
RewriteRule ^(gen|[a-f0-9]+)$ index.php?$1 [L]
RewriteCond %{REQUEST_URI} !^/(cross|index)\.php$
RewriteRule ^(.*)$ index.php [L]

最後一條規則的 NS 應該有效。也可以按照其他規則來做,沒有壞處。我要到我正在做的地方'

$$ L,NS $$’,在有 L 的地方添加 NS。

RewriteEngine on
RewriteRule ^xpaste$ cross.php [L]
RewriteRule ^x([a-f0-9]*)$ cross.php?id=$1 [L]
RewriteRule ^(gen|[a-f0-9]+)$ index.php?$1 [L]
RewriteRule ^(.*)$ index.php [L,NS] 

我還沒有測試過這些,但是這裡還有一個有趣的方法,對於您更通用的解決方案,使用 IS_SUBREQ 變數。 https://stackoverflow.com/questions/9555247/can-anyone-think-of-when-a-sub-request-rewrite-is-useful

這篇文章也提到了 REDIRECT_STATUS 變數。 http://www.webmasterworld.com/apache/4299003.htm

引用自:https://serverfault.com/questions/241907