Apache-2.2

連結重複性和 mod_rewrite

  • October 1, 2010

我正在執行 Apache 2.2.11

.htaccess

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php [L,QSA]

問題: http://localhost/index正確地給了我首頁(index.php),但我也可以通過以下網址訪問同一頁面。

http://localhost/index/
http://localhost/index/blahblah
http://localhost/index/blahblah/blah/blah/blah
http://localhost/index.php/
http://localhost/index.php/blahblah/
http://localhost/index.php/blahblah/blah/blah

我想確保只有 localhost/index 會打開 localhost/index.php,除了 localhost/index(甚至 localhost/index.php)以外的任何東西都應該返回 404。

我想我將不得不添加另一個RewriteCond來擷取除現有 Request_Filename.php 文件之外的所有其他文件。除了 localhost/index 之外,我如何獲得 404?

(這個問題也有賞金,但我猜 serverfault 可能是一個更好的地方。) 更新 .htaccess 做什麼?htaccess 文件的目的是啟用更清晰的 url,如 localhost/index 而不是 localhost/index.php 更多解釋可以在此程式碼的原始碼中找到

鑑於問題範圍的變化,我將再次嘗試回答它……

.htaccess 有什麼作用?

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.*)$ $1.php [L,QSA]
  1. 如果請求的 URI 不是有效文件,則匹配。
  2. 如果請求的 URI 不是有效目錄,則匹配。
  3. 如果請求的 URI 加上“任何單個字元”加上“php” 一個有效的 PHP 文件,則匹配(請注意,這將匹配“index-php”和“index.php”一樣 - 如果需要,您應該轉義句點字元文字匹配)。
  4. 將請求傳遞給“無論請求字元串是什麼”( ^(.*)$) 加上“.php” - 附加查詢字元串 ( [QSA]) 並在此規則 () 之後停止處理 mod_rewrite 指令[L]

這些規則有一些嚴重的問題——例如,如果您創建一個名為“index”的目錄,請求“domain.com/index”的使用者將獲得該目錄,而不是您的 index.php 文件。

鑑於您聲明的意圖:

我想確保只有 localhost/index 會打開 localhost/index.php,除了 localhost/index(甚至 localhost/index.php)以外的任何東西都應該返回 404。

…我會推薦以下實現:

.htaccess

RewriteEngine On
RewriteCond %{REQUEST_URI} ^/index$
RewriteRule .* /index.php [L,QSA]

索引.php

if ( $_SERVER['REQUEST_URI'] != '/index' ) {
 header("Status: 404 Not Found");
 require( '404.html' );
 die();
}

更新:

如果沒有 index.php 的腳本,我怎麼能做同樣的事情?

據我所知,如果不呼叫 kludge 就無法做到這一點,因為當 /index 傳遞給 /index.php 時,將觸發適用於 /index.php 的任何規則

這是不雅的kludge:

RewriteEngine On

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

RewriteCond %{REQUEST_URI} ^/index\.php$
RewriteCond %{QUERY_STRING} !rw=1 [NC]
RewriteRule .* - [F]

(現在任何人都可以訪問“/index.php?rw=1”——它不像腳本編輯那麼優雅)

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