簡體   English   中英

重定向 php,同時保留 URL

[英]Redirect php while keeping URL

我正在嘗試以一種非常常見的方法重定向 URL,但是,我無法弄清楚這一點。 我已經閱讀了一篇又一篇文章,但無法取得任何進展。 我只是想在 php 中將 URL 之類的 'domain.com/xx/xxxxxxxxxx' 重定向到 '/index.ZE1BFD762321E409CEE4AC0B6E84196xxx'CZ? 我已經嘗試了幾個 apache mod_rewrites 並且可以讓 URL 在瀏覽器中保持所需的狀態,但是當我查看 index.ZE1BFD762321E409CEE4AC 中的 $_SERVER['REQUEST_URI'] 時,它沒有按預期顯示。 相反,它顯示的是輸入的 URI,而不是重寫。 它還總是添加 URL 的“xx”部分。 例如:

URL: domain.com/ab/1234567890
PHP: ab/1234567890
     ab/include/file.css
     ab/include/another.css

Getting: $_SERVER['REQUEST_URI'] = domain.com/ab/1234567890
Desired: $_SERVER['REQUEST_URI'] = domain.com/index.php?first=ab&last=1234567890

沒有'ab'目錄,它應該尋找'include/file.css'等文件。

以下是我嘗試過的一些重定向:

 RewriteRule ^([a-zA-Z0-9/]+)$ index.php?first=$1

 RewriteCond %{QUERY_STRING} /([a-z][a-z])/([a-zA-Z0-9]+)
 RewriteRule ^/([a-z][a-z])/([a-zA-Z0-9]+)$ index.php?first=$1&last=$2 [L]

 RewriteCond   %{QUERY_STRING}           ^[a-z][a-z]/[a-zA-Z0-9]$
 RewriteRule   ^[a-z][a-z]/[a-zA-Z0-9]+$         index.php      [L,R=301]

我已經嘗試了很多其他方法,但我嘗試的任何方法似乎都不起作用。 也許是因為我不熟悉 apache 重定向以及它如何與 PHP 交互。 我擅長 PHP,只是不擅長 apache,因此可能是我不知道要查找的術語的情況...

任何幫助將不勝感激!

更新

我當前的 apache 配置是:

RewriteEngine On
RewriteRule ^[a-z][a-z]/([a-z/]+.css)$ $1   [L]
RewriteRule ([a-z][a-z])/([a-zA-Z0-9]+) index.php?first=$1&second=$2    [L]

我嘗試過切換訂單,但這似乎沒有任何區別。 如果我檢查 PHP 中的 $_SERVER['QUERY_STRING'] 變量值,它確實在瀏覽器中為原始 URL 正確格式化:

Browser: domain.com/ab/0123456789
$_SERVER['QUERY_STRING']: first=ab&second=0123456789

但是,對於頁面請求的所有外部文件,這些文件沒有正確重定向,並且 PHP 腳本輸出錯誤的值:

Browser: domain.com/ab/include/style.css
$_SERVER['QUERY_STRING']: first=ab&second=include

這應該報告為:

$_SERVER['QUERY_STRING']: include/style.css

似乎由於某種原因沒有為 css 文件選擇第一個 RewriteRule。 這也發生在 js 文件中(顯然是因為還沒有為它們設置規則)。

如果我使用相對路徑或硬路徑也沒有區別......

解析度

在繼續努力使 apache 重定向工作后,我不得不為每個外部源位置添加一個特定的行(不知道為什么“不要恐慌”中的原始 RegEx 語句不起作用)。 這是我的 .htaccess 文件現在的樣子:

# these are for the external file requests
RewriteRule [a-z][a-z]/images/([a-zA-Z0-9_\.]+)$ /images/$1 [L]
RewriteRule [a-z][a-z]/styles/([a-zA-Z0-9_\.]+)$ /styles/$1 [L]

# these are for the main request for the bootstrap php file
RewriteBase /  
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ([a-z][a-z])/([a-zA-Z0-9]+) index.php?first=$1&second=$2 [L]

另請注意:如果您有任何未在此示例中創建的外部文件(例如 styles/non_existent.css),則上面的最后一個“RewriteRule”將執行並基本上運行 index.php 文件,從而導致您的站點出錯。 因此,請確保您創建(或刪除對)外部文件的引用——即使它們是空白的!!!

感謝您的所有幫助“不要驚慌”!

據我了解,這些是您的要求:

  • 您希望將最初請求的 URL 留在瀏覽器中,即不是外部的、對訪問者可見的 301 類型重定向。 換句話說,map URL 在瀏覽器中對文件系統上的其他內容是透明的。

  • 傳入的請求包括2個可以用正則表達式匹配的段;

  • 您希望能夠以 PHP 參數的形式訪問請求的這兩個目錄元素;

Apache 內部重定向將執行此操作。 Apache 文檔中mod_rewrite 示例頁面上的第一個示例描述了這一點(盡管您可能不需要在那里使用[PT]標志, 它允許進一步處理映射的 URI)。 我認為以下應該做你需要的:

RewriteEngine on
RewriteRule ([a-z][a-z])/([0-9]+) index.php?first=$1&last=$2 [L]

這將處理傳入的請求,如domain.com/ab/1234567890和 map - 透明地,不可見地 - 到index.php?first=ab&last=1234567890 訪問者在他們的瀏覽器中看不到任何重定向,只看到原始的 URL。 您仍然可以通過$_SERVER訪問外部請求和內部處理的不同元素:

...
[QUERY_STRING] => first=ab&last=1234567890
[REQUEST_URI] => /ab/1234567890
[SCRIPT_NAME] => /index.php
[PHP_SELF] => /index.php
...
[argv] => Array
    (
        [0] => first=ab&last=1234567890
    )

因此,例如,您可以在代碼中使用$_GET['first']來查找ab

更新

要回答評論中添加的額外問題 - 從index.php引用您的 CSS/JS,最簡單和最有效的選擇是使用絕對引用:

<link href="/css/some.css" rel="stylesheet">

如果您不能這樣做,而是希望相對鏈接起作用,您可以嘗試另一個內部重新映射。 請注意,帶有[R=301]的外部重定向(就像您在評論中顯示的那樣)會更慢,因為它確實是一個全新的請求和響應。

Assuming you have CSS files like include/file.css , where the include/ directory is in the same directory as index.php , then a relative CSS reference in index.php like:

<link href="include/some.css" rel="stylesheet">

將 - 使用上面的第一個重定向規則 - 實際上會生成對ab/include/some.css的請求。 要將其重新映射到您的真實文件,請使用以下內部重定向規則:

RewriteRule ^[a-z][a-z]/([a-z/]+.css)$ $1 [L]

請注意,您現在需要注意規則不會重疊或相互干擾,因此我在兩者中都添加了[L] ,並且還在 CSS 正則表達式中添加了一些錨點。

一旦頁面更改,Url 將始終更改。 規避此問題的方法是使用 javascript 並在 div 中加載 url 內容,或在 ZFC35FDC777777 中使用 iframe 中的 iframe 到目標顯示頁面。

暫無
暫無

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

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