簡體   English   中英

mod_rewrite:使用環境變量防止多次重寫

[英]mod_rewrite: Prevent multiple rewrites using an environment variable

我目前正在為* .php返回404錯誤,並使用以下命令將所有請求內部重定向到一個PHP文件(如果存在):

RewriteCond %{REQUEST_URI} /(?!index$)
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.+)$ /$1.php [QSA,L,E=norewrite:1]

RewriteCond %{ENV:norewrite} !1
RewriteCond %{REQUEST_URI} \.php$
RewriteRule ^(.+)$ - [R=404]

這很好。 但是,我希望能夠從index.php.src之類的文件提供PHP(或其他)源(具有適當的擴展名),同時讓index.php.src如果直接訪問也返回404。

RewriteCond %{REQUEST_URI} /(?!index$)
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.+)$ /$1.php [QSA,L,E=norewrite:1]

RewriteCond %{ENV:norewrite} !1
RewriteCond %{REQUEST_FILENAME}\.src -f
RewriteRule ^(.+)$ /$1.src [L,E=norewrite:1]

RewriteCond %{ENV:norewrite} !1
RewriteCond %{REQUEST_URI} \.php$ [OR]
RewriteCond %{REQUEST_URI} \.src$
RewriteRule ^(.+)$ - [R=404]

這似乎不起作用。 它在內部重定向到index.php,然后重定向到index.php.src,然后是404s。

有趣的是,在第一個示例中,環境變量DOES阻止了第二個規則集的執行,並且頁面按預期加載。 當我添加第二個示例中的中間規則集時,環境變量似乎不再起作用。 如果我從第二個示例中刪除了第二個規則集,而將其他行保留在最后一個規則集中,則它的行為就與第一個示例一樣(除非請求例如index.php.src返回404,這就是我想要的) 。

由於各種原因,為此目的而使用查詢字符串是不可接受的,它必須是環境變量。

我該如何進行這項工作? 我究竟做錯了什么?

編輯:以防我解釋得不好(我很確定我做到了)...

  • 存在以下兩個文件:'index.php'和'index.php.src'
  • 如果我請求帶有第一組規則的http://domain.com/,則會得到我的主頁(如預期)。 使用第二組規則,我得到404。使用第二組規則,減去第二節,我得到了我的主頁(與預期的一樣)。
  • 如果我要求使用任何一組規則的http://domain.com/index,我都會得到一個404,正如預期的那樣。
  • 如果我使用任何一組規則請求http://domain.com/index.php,我都會得到404。這在第一組規則中是預期的,但我希望將其提供給“ index.php.src”的內容。
  • 如果我請求使用第一組規則的http://domain.com/index.php.src,則會得到'index.php.src'的內容,這是預期的,因為* .src上的404規則不是在那個集合中。 無論有沒有第二節,在第二組中我都能得到預期的404。

問題似乎出在第二節,但我無法弄清楚出了什么問題...

這是我所做的工作:

RewriteCond %{IS_SUBREQ} false
RewriteCond %{REQUEST_URI} /(?!index$)
RewriteCond %{ENV:REDIRECT_STOP} !1
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.+)$ /$1.php [QSA,L,E=STOP:1]

RewriteCond %{IS_SUBREQ} false
RewriteCond %{ENV:REDIRECT_STOP} !1
RewriteCond %{REQUEST_FILENAME}\.src -f
RewriteRule ^(.+)$ /$1.src [L,E=STOP:1]

RewriteCond %{IS_SUBREQ} false
RewriteCond %{ENV:REDIRECT_STOP} !1
RewriteCond %{REQUEST_URI} \.php$ [OR]
RewriteCond %{REQUEST_URI} \.src$
RewriteRule ^(.+)$ - [R=404]

您會注意到我添加了%{IS_SUBREQ}位,這有助於解決導致它返回404的首頁重新分配問題。那時,查詢字符串方法變得可以接受,並且確實可以使用該方法,但是'不是那種jsut的類型,我知道這是可以做到的,而我會做的(我做到了!)

除了將變量名從'norewrite'更改為'STOP'(為清楚起見)外,我還了解到在發生內部重定向時,由mod_rewrite設置的環境變量以'REDIRECT_'為前綴。 這就是為什么設置'norewrite'('STOP')的值,然后檢查相同的變量不起作用的原因。 當我在檢查行中將“ REDIRECT_”附加到它之后,它現在的行為與預期的一樣。

  • 請求'/ awesome'將處理'awesome.php'並返回其輸出
  • 請求“ /awesome.php”將返回“ awesome.php.src”的內容(這是“ awesome.php”的符號鏈接)
  • 請求'awesome.php.src'將返回404

這正是我想要的! 希望這也會對其他人有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM