連結重複性和 mod_rewrite
我正在執行 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]
- 如果請求的 URI 不是有效文件,則匹配。
- 如果請求的 URI 不是有效目錄,則匹配。
- 如果請求的 URI 加上“任何單個字元”加上“php”是 一個有效的 PHP 文件,則匹配(請注意,這將匹配“index-php”和“index.php”一樣 - 如果需要,您應該轉義句點字元文字匹配)。
- 將請求傳遞給“無論請求字元串是什麼”(
^(.*)$
) 加上“.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”——它不像腳本編輯那麼優雅)