導航:首頁 > 編程語言 > php怎麼解決跨域問題

php怎麼解決跨域問題

發布時間:2023-07-16 15:06:24

㈠ 前端vue與後端Thinkphp在伺服器的部署

vue在服務端部署時,我們都知道通過npm run build 指令打包好的dist文件,通過http指定是可以直接瀏覽的,Thinkphp通過域名指向index.php文件才可以瀏覽。要使前端正常調用後端數據,有兩種方法:1、前端跨域調用後端數據,2、前端打包文件部署在後端的伺服器文件夾下(同域)。

web伺服器: apache

一、跨域

在伺服器配置站點:

在路徑/home/www/  下創建test項目文件夾,用來放項目文件。  

找到httpd-vhosts.conf文件配置站點  

前端站點:  

    ServerName test.test.com  

    DocumentRoot "/home/www/test/dist"    

    DirectoryIndex index.html  

後端站點:  

    ServerName test.testphp.com  

    DocumentRoot "/home/www/test/php"    

    DirectoryIndex index.php  

將前端打包好的dist文件放在/home/www/test/ 文件夾下,運行http://test.test.com可瀏覽,當路徑改變時,刷新會出現404錯誤。此時dist文件下創建一個.htaccess文件,當路徑不存在時,路徑指向http://test.test.com/index.html能解決此問題。

  RewriteEngine On  

  RewriteBase /  

  RewriteRule ^index\.html$ - [L]  

  RewriteCond %{REQUEST_FILENAME} !-f  

  RewriteCond %{REQUEST_FILENAME} !-d  

  RewriteRule . /index.html [L]  

在/home/www/test文件夾下創建項目根目錄php文件夾,將thinkphp文件放在php下。TP5的入口文件在public文件下,在這將public下的入口文件index.php挪到php文件夾下(個人習慣將入口文件放在項目根目錄), 後端綁定Index模塊。

前端調用後端介面,存在跨域,跨域解決方法有好幾種,在這我將在後端php做配置,解決跨域問題,在公用控制器設置跨域配置:

class Common extends Controller  

{  

    public $param;  

    // 設置跨域訪問  

    public function _initialize()  

    {  

        parent::_initialize();  

        isset($_SERVER['HTTP_ORIGIN']) ? header('Access-Control-Allow-Origin: '.$_SERVER['HTTP_ORIGIN']) : '';  

        header('Access-Control-Allow-Credentials: true');  

        header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');  

        header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, authKey, sessionId");  

$param =  Request::instance()->param();  

$this->param = $param;  

    }  

}  

前端調用登錄介面: this.axios.post('http://test.testphp.com/index.php/base/login', {user: '', password: ''})。

(可在webpack.base.conf.js文件下可定義介面:http://test.testphp.com/index.php/)

二、同域

後端配置同上,公共配置器中的header配置注釋。將前端的dist文件下的所有文件(包含.htaccess),放在php文件夾下。將後端index控制器的index方法的路徑重定向php下的index.html文件:

namespace app\index\controller;  

use think\Controller;  

class Index extends Controller  

{  

    public function index() {  

$this->redirect('/index.html');  

    }  

}  

前端調用登錄介面: this.axios.post('/index.php/base/login', {user: '', password: ''})

轉自:https://blog.csdn.net/qq_35465132/article/details/78986675

㈡ thinkphp6解決 CORS 跨域

1,在app/middleware.php中添加

中間件,這樣就改成了

*是不安全的,可沖早以在config/cookie.php配置cookie 有效域名的domain

如果介面悶判凳請求發送了token,會提示Access-Control-Allow-Headers這個問題螞旅,tp6默認是這樣

可以在'Access-Control-Allow-Headers' 這一樣加上XXX-token,

我在搞這個時還遇見post請求變成get

把method改成了type

㈢ PHP跨域上傳的幾種方法

方法一:
文件夾:/home/web/attachments
虛擬二級目錄到/home/web/zxsv/下(支持同區域網的伺服器)
​這樣多個子域名進行上傳的設計時,只需要attachments目錄映射為相關的域名的二級目錄,這樣就可實現多個子域名共享一個附件伺服器了,這種方法最好是用區域網中的附件伺服器,這樣流量是分開的,當然訪問附件的域名是apache,ngixn,IIS等的虛擬二級目錄就不說了,好處是現有程序不做任何修改,唯一壞處就是兩台伺服器必須在一個區域網中,當然你用單台也就沒這個問題了
方法二:FTP同步更新
PHP是支持FTP的,給個FTP類裡面(不是我寫的,只是加了個建立多級目錄),自己看著辦吧,上傳後調用FTP類,同步到FTP伺服器中,好處是現有程序只需要在上傳那段加上FTP上傳就行了,壞處就是一定要支持FTP
<?php
$ftp=new Ftp;
//print_r($ftp->nlist(」"));
$ftp->makedir(」3″);
//$ftp->put(」comment.php」,」1.txt」);
$ftp->bye();
//R FTP 處理;
class ftp {
var $ftpUrl = 『www.zxsv.com』;
var $ftpUser = 『zxsv』;
var $ftpPass = 『111111′;
var $ftpDir = 『/zxsv/』;
var $ftpR = 」; //R ftp資源;
var $status = 」;
//R 1:成功;2:無法連接ftp;3:用戶錯誤;
function ftp() {
if ($this->ftpR = ftp_connect($this->ftpUrl, 21)) {
if (ftp_login($this->ftpR, $this->ftpUser, $this->ftpPass)) {
if (!empty($this->ftpDir)) {
ftp_chdir($this->ftpR, $this->ftpDir);
}
ftp_pasv($this->ftpR, true);//R 啟用被動模式;
$status = 1;
} else {
$status = 3;
}
} else {
$status = 2;
}
}
//R 切換目錄;
function cd($dir) {
return ftp_chdir($this->ftpR, $dir);
}
//建立目錄
function mkdir($dir){
return ftp_mkdir($this->ftpR, $dir);
}
function makedir($dir) {
if(!$dir) return 0;
$dir = str_replace( 「\\」, 「/」, $dir );
$mdir = 「」;
foreach(explode( 「/」, $dir ) as $val ) {
$mdir .= $val.」/」;
if( $val == 「..」 || $val == 「.」 ) continue;
if(!@mkdir($mdir)){
echo 「創建目錄 [".$mdir."]失敗.」;
//exit;
}
}
return true;
}
//刪除目錄
function rmdir($dir){
return ftp_rmdir($this->ftpR, $dir);
}
//R 返回當前路勁;
function pwd() {
return ftp_pwd($this->ftpR);
}
//R 上傳文件;
function put($localFile, $remoteFile = 」) {
if ($remoteFile == 」) {
$remoteFile = end(explode(』/', $localFile));
}
$res = ftp_nb_put($this->ftpR, $remoteFile, $localFile, FTP_BINARY);
print_r($res);
while ($res == FTP_MOREDATA) {
$res = ftp_nb_continue($this->ftpR);
}
if ($res == FTP_FINISHED) {
return true;
} elseif ($res == FTP_FAILED) {
return false;
}
}
//R 下載文件;
function get($remoteFile, $localFile = 」) {
if ($localFile == 」) {
$localFile = end(explode(』/', $remoteFile));
}
if (ftp_get($this->ftpR, $localFile, $remoteFile, FTP_BINARY)) {
$flag = true;
} else {
$flag = false;
}
return $flag;
}
//R 文件大小;
function size($file) {
return ftp_size($this->ftpR, $file);
}
//R 文件是否存在;
function isFile($file) {
if ($this->size($file) >= 0) {
return true;
} else {
return false;
}
}
//R 文件時間
function fileTime($file) {
return ftp_mdtm($this->ftpR, $file);
}
//R 刪除文件;
function unlink($file) {
return ftp_delete($this->ftpR, $file);
}
function nlist($dir = 『/service/resource/』) {
return ftp_nlist($this->ftpR, $dir);
}
//R 關閉連接;
function bye() {
return ftp_close($this->ftpR);
}
}
?>

閱讀全文

與php怎麼解決跨域問題相關的資料

熱點內容
伺服器如何上傳網站東西 瀏覽:204
編譯器怎麼通過系統控制台輸出的 瀏覽:467
拆傢具用什麼app 瀏覽:45
單片機國內外 瀏覽:651
函數的運演算法則題目 瀏覽:719
有免費編譯軟體嗎 瀏覽:918
java互聯網公司 瀏覽:70
對弈下象棋的app哪裡好 瀏覽:707
有什麼食譜app推薦 瀏覽:471
python實現動態口令 瀏覽:825
我的世界電腦伺服器地址怎麼添加 瀏覽:850
傳奇地圖怎麼加密到pak 瀏覽:977
linux刪除mysql用戶 瀏覽:755
圖案設計pdf 瀏覽:586
pdf編輯器在線 瀏覽:471
華為雲雲耀伺服器如何關機 瀏覽:995
數字加密的歷史 瀏覽:614
宏傑文件夾打不開 瀏覽:819
施工日記app哪個好 瀏覽:566
什麼是壓縮機的排氣量 瀏覽:539