2017-06-03 38 views
0
我有我的.htaccess/.php文件 一個問題,我建立了我的web項目的方式,它分爲3個層次

如何讓mod_rewrite只在輸入特定的url時才重寫?

  • 基礎水平(mywebsite.com)
  • 頁( mywebsite.com/news)
  • 子頁/篇(mywebsite.com/news/123)

,並正在按照預期的所有三個,這是我的.htaccess:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^/]+)/?$ index.php?page=$1 [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^/]+)/([^/]+)/?$ index.php?page=$1&sub=$2 [L] 

我不得不承認,我不是很好的與的.htaccess/mod_rewrite的正則表達式,因爲它是我做了很少到這一點。

但是現在我的問題是,如果頁面標識(請參閱$ 1)無效,人們不會被髮送到404錯誤頁面,就像人們可以在技術上輸入mywebsite.com/asdasdasd/並且它會將它們顯然)的index.php,現在我的問題是,這可以在.htaccess中以某種方式完成,或者我應該只使用PHP來檢查他們輸入的ID是否有效?我也看到有一個東西叫RewriteMap指令,但我不想改變的httpd.conf

誰能幫助?

+0

通常驗證數據庫'id'是在php級別完成的,而不是在http服務器級別以下。所以很可能你想從你的php腳本發送一個404頭文件,這個頭文件可以從數據庫中獲取請求的頁面。否則,你必須檢查數據庫_twice_哪個(通常)會造成性能損失。 – arkascha

+0

@arkascha就像我想的那樣,基本上通過htaccess正則表達式獲取參數,並讓PHP處理其餘部分,並根據需要將用戶重定位到404頁面,感謝輸入。 – Cerbion

回答

1

這可以在.htaccess中以某種方式完成,或者我應該使用php 來檢查他們輸入的ID是否有效?

我不認爲這是規劃問題,但邏輯之一。

  • 阿帕奇不知道哪些頁面有效/新聞/聯繫人/幫助等。
  • PHP 知道哪些頁面是有效的

所以,你只有兩種選擇

一)指定.htaccess每一個可能的網站是可怕的實踐

b)檢查在PHP是頁面有效然後扔404這只是一個合理的解決方案。

+0

是的,我認爲,我只是不知道它是否可以通過.htaccess完成,因爲我對它沒有什麼經驗;) – Cerbion

1

試試看看這個代碼。希望這會幫助你,

的.htaccess

RewriteEngine on 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-l 

RewriteRule ^(.+)$ index.php?url=$1 [QSA,L] 

的index.php

​​

現在,在URL中你會得到在ARRY格式的所有URL段。

If your url is: mywebsite.com/news/123 then output will be: 

Array ([0] => news [1] => 123) 

您可以根據需要訪問並添加自己的邏輯或條件。希望這會幫助你。

問候!

+0

就這樣,它簡化了.htaccess的代碼,反過來允許更「自由」的方式來處理參數,這已經很不錯了,儘管我仍然希望將人員發送到404頁面。它只能通過PHP完成嗎? (不是我不喜歡這種方法,只是很不熟悉mod_rewrite的範圍,我覺得有可能只用正則表達式來解決它) – Cerbion

+0

@Cerbion沒有具體的方法來檢查與Apache配置的網址。 –