Access-Control-Allow-Origin các miền phụ ký tự đại diện, cổng và giao thức

336
Elie 2012-12-23 03:44.

Tôi đang cố kích hoạt CORS cho tất cả các miền phụ, cổng và giao thức.

Ví dụ: tôi muốn có thể chạy một yêu cầu XHR từ http://sub.mywebsite.com:8080/ đến https://www.mywebsite.com/*

Thông thường, tôi muốn kích hoạt yêu cầu từ đối sánh nguồn gốc (và giới hạn ở):

//*.mywebsite.com:*/*

10 answers

218
Noyo 2015-01-17 08:09.

Dựa trên câu trả lời của DaveRandom , tôi cũng đã tìm hiểu và tìm thấy một giải pháp Apache đơn giản hơn một chút tạo ra kết quả tương tự ( Access-Control-Allow-Originđược đặt thành giao thức cụ thể hiện tại + tên miền + cổng động) mà không sử dụng bất kỳ quy tắc viết lại nào:

SetEnvIf Origin ^(https?://.+\.mywebsite\.com(?::\d{1,5})?)$ CORS_ALLOW_ORIGIN=$1
Header append Access-Control-Allow-Origin  %{CORS_ALLOW_ORIGIN}e   env=CORS_ALLOW_ORIGIN
Header merge  Vary "Origin"

Và đó là nó.

Những người muốn bật CORS trên miền mẹ (ví dụ: mywebsite.com) ngoài tất cả các miền phụ của nó có thể chỉ cần thay thế biểu thức chính quy ở dòng đầu tiên bằng biểu thức sau:

^(https?://(?:.+\.)?mywebsite\.com(?::\d{1,5})?)$.

Lưu ý: Để tuân thủ đặc điểm kỹ thuật và hành vi lưu vào bộ nhớ đệm chính xác, LUÔN LUÔN thêm Vary: Origintiêu đề phản hồi cho các tài nguyên hỗ trợ CORS, ngay cả đối với các yêu cầu không phải CORS và các yêu cầu từ nguồn gốc không được phép (xem ví dụ tại sao ).

267
monsur 2012-12-23 10:14.

Thông số CORS là tất cả hoặc không có gì. Nó chỉ hỗ trợ *, nullhoặc chính xác giao thức + miền + cổng:http://www.w3.org/TR/cors/#access-control-allow-origin-response-header

Máy chủ của bạn sẽ cần xác thực tiêu đề gốc bằng cách sử dụng regex và sau đó bạn có thể lặp lại giá trị gốc trong Access-Control-Allow-Origintiêu đề phản hồi.

60
DaveRandom 2013-09-24 02:09.

CHỈNH SỬA : Sử dụng giải pháp của @ Noyo thay vì giải pháp này. Nó đơn giản hơn, rõ ràng hơn và có khả năng hoạt động tốt hơn rất nhiều khi tải.

CÂU TRẢ LỜI GỐC TRÁI Ở ĐÂY CHỈ CHO CÁC MỤC ĐÍCH LỊCH SỬ !!


Tôi đã tìm cách giải quyết vấn đề này và đưa ra giải pháp .htaccess (hoặc httpd.conf) có thể tái sử dụng này hoạt động với Apache:

<IfModule mod_rewrite.c>
<IfModule mod_headers.c>
    # Define the root domain that is allowed
    SetEnvIf Origin .+ ACCESS_CONTROL_ROOT=yourdomain.com

    # Check that the Origin: matches the defined root domain and capture it in
    # an environment var if it does
    RewriteEngine On
    RewriteCond %{ENV:ACCESS_CONTROL_ROOT} !=""
    RewriteCond %{ENV:ACCESS_CONTROL_ORIGIN} =""
    RewriteCond %{ENV:ACCESS_CONTROL_ROOT}&%{HTTP:Origin} ^([^&]+)&(https?://(?:.+?\.)?\1(?::\d{1,5})?)$
    RewriteRule .* - [E=ACCESS_CONTROL_ORIGIN:%2]

    # Set the response header to the captured value if there was a match
    Header set Access-Control-Allow-Origin %{ACCESS_CONTROL_ORIGIN}e env=ACCESS_CONTROL_ORIGIN
</IfModule>
</IfModule>

Chỉ cần đặt ACCESS_CONTROL_ROOTbiến ở đầu khối thành miền gốc của bạn và nó sẽ lặp Origin:lại giá trị tiêu đề yêu cầu trở lại máy khách trong Access-Control-Allow-Origin:giá trị tiêu đề phản hồi nếu nó khớp với miền của bạn.

Cũng lưu ý rằng bạn có thể sử dụng sub.mydomain.comnhư là ACCESS_CONTROL_ROOTvà nó sẽ giới hạn nguồn gốc thành sub.mydomain.com*.sub.mydomain.com(tức là nó không phải là gốc miền). Các phần tử được phép thay đổi (giao thức, cổng) có thể được kiểm soát bằng cách sửa đổi phần đối sánh URI của regex.

25
Pratap Koritala 2016-09-24 09:54.

Tôi đang trả lời câu hỏi này, vì câu trả lời được chấp nhận không thể thực hiện theo

  1. nhóm regex là một lần truy cập hiệu suất , điều này không cần thiết.
  2. không thể khớp với miền chính và nó chỉ hoạt động cho miền phụ.

Ví dụ: Nó sẽ không gửi tiêu đề CORS cho http://mywebsite.com trong khi làm việc cho http://somedomain.mywebsite.com/

SetEnvIf Origin "http(s)?://(.+\.)?mywebsite\.com(:\d{1,5})?$" CORS=$0

Header set Access-Control-Allow-Origin "%{CORS}e" env=CORS
Header merge  Vary "Origin"

Để kích hoạt trang web của mình, bạn chỉ cần đặt trang web của mình vào vị trí của "mywebsite.com" trong Cấu hình Apache ở trên.

Để cho phép Nhiều trang web:

SetEnvIf Origin "http(s)?://(.+\.)?(othersite\.com|mywebsite\.com)(:\d{1,5})?$" CORS=$0

Kiểm tra Sau khi triển khai:

Phản hồi cuộn tròn sau phải có tiêu đề "Access-Control-Allow-Origin" sau khi thay đổi.

curl -X GET -H "Origin: http://examplesite1.com" --verbose http://examplesite2.com/query
14
Lars 2015-05-23 00:42.

Tôi cần một giải pháp chỉ dành cho PHP, vì vậy đề phòng ai đó cũng cần đến nó. Nó nhận một chuỗi đầu vào được phép như "* .example.com" và trả về tên máy chủ tiêu đề yêu cầu, nếu đầu vào khớp.

function getCORSHeaderOrigin($allowed, $input)
{
    if ($allowed == '*') { return '*'; } $allowed = preg_quote($allowed, '/'); if (($wildcardPos = strpos($allowed, '*')) !== false) { $allowed = str_replace('*', '(.*)', $allowed); } $regexp = '/^' . $allowed . '$/';

    if (!preg_match($regexp, $input, $matches)) { return 'none'; } return $input;
}

Và đây là các trường hợp thử nghiệm cho nhà cung cấp dữ liệu phpunit:

//    <description>                            <allowed>          <input>                   <expected>
array('Allow Subdomain',                       'www.example.com', 'www.example.com',        'www.example.com'),
array('Disallow wrong Subdomain',              'www.example.com', 'ws.example.com',         'none'),
array('Allow All',                             '*',               'ws.example.com',         '*'),
array('Allow Subdomain Wildcard',              '*.example.com',   'ws.example.com',         'ws.example.com'),
array('Disallow Wrong Subdomain no Wildcard',  '*.example.com',   'example.com',            'none'),
array('Allow Double Subdomain for Wildcard',   '*.example.com',   'a.b.example.com',        'a.b.example.com'),
array('Don\'t fall for incorrect position',    '*.example.com',   'a.example.com.evil.com', 'none'),
array('Allow Subdomain in the middle',         'a.*.example.com', 'a.bc.example.com',       'a.bc.example.com'),
array('Disallow wrong Subdomain',              'a.*.example.com', 'b.bc.example.com',       'none'),
array('Correctly handle dots in allowed',      'example.com',     'exampleXcom',            'none'),
3
AamirR 2018-10-28 03:33.

Khi thiết lập Access-Control-Allow-Origintrong .htaccess, chỉ những điều sau mới hoạt động:

SetEnvIf Origin "http(s)?://(.+\.)?domain\.com(:\d{1,5})?$" CRS=$0
Header always set Access-Control-Allow-Origin "%{CRS}e" env=CRS

Tôi đã thử nhiều từ khóa gợi ý khác Header append, Header set, không ai làm việc như đề xuất trong nhiều câu trả lời trên SO, mặc dù tôi không có ý tưởng nếu những từ khóa được lỗi thời hoặc không hợp lệ cho nginx .

Đây là giải pháp hoàn chỉnh của tôi:

SetEnvIf Origin "http(s)?://(.+\.)?domain\.com(:\d{1,5})?$" CRS=$0
Header always set Access-Control-Allow-Origin "%{CRS}e" env=CRS
Header merge Vary "Origin"

Header always set Access-Control-Allow-Methods "GET, POST"
Header always set Access-Control-Allow-Headers: *

# Cached for a day
Header always set Access-Control-Max-Age: 86400

RewriteEngine On

# Respond with 200OK for OPTIONS
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L]
2
K8sN0v1c3 2017-11-19 08:30.

Chúng tôi đã gặp sự cố tương tự với Font Awesome trên miền tĩnh "không có cookie" khi đọc phông chữ từ "miền cookie" (www.domain.tld) ​​và bài đăng này là người hùng của chúng tôi. Xem ở đây: Làm cách nào để khắc phục sự cố webfont 'Thiếu tiêu đề phản hồi giữa các nguồn gốc chéo (CORS)'?

Đối với các loại copy / paste-r (và để cung cấp một số đạo cụ), tôi đã ghép nó lại với nhau từ tất cả các đóng góp và thêm nó vào đầu tệp .htaccess của gốc trang web:

<IfModule mod_headers.c>
 <IfModule mod_rewrite.c>
    SetEnvIf Origin "http(s)?://(.+\.)?(othersite\.com|mywebsite\.com)(:\d{1,5})?$" CORS=$0
    Header set Access-Control-Allow-Origin "%{CORS}e" env=CORS
    Header merge  Vary "Origin"
 </IfModule>
</IfModule>

Siêu an toàn, siêu thanh lịch. Yêu thích: Bạn không cần phải mở băng thông máy chủ của mình cho những kẻ trộm tài nguyên / các loại liên kết nóng.

Đạo cụ cho: @Noyo @DaveRandom @ pratap-koritala

(Tôi đã cố gắng để đây là một nhận xét cho câu trả lời được chấp nhận, nhưng tôi chưa thể làm điều đó)

1
Jack K 2018-04-25 10:00.

Có vẻ như câu trả lời ban đầu dành cho trước Apache 2.4. Nó không làm việc cho tôi. Đây là những gì tôi đã phải thay đổi để làm cho nó hoạt động trong 2.4. Điều này sẽ hoạt động đối với bất kỳ độ sâu nào của miền phụ của yourcompany.com .

SetEnvIf Host ^((?:.+\.)*yourcompany\.com?)$ CORS_ALLOW_ORIGIN=$1
Header append Access-Control-Allow-Origin  %{REQUEST_SCHEME}e://%{CORS_ALLOW_ORIGIN}e    env=CORS_ALLOW_ORIGIN
Header merge  Vary "Origin"
1
RiZKiT 2018-12-05 00:54.

Đối với Spring Boot, tôi tìm thấy điều này RegexCorsConfigurationmở rộng chính thức CorsConfiguration:https://github.com/looorent/spring-security-jwt/blob/master/src/main/java/be/looorent/security/jwt/RegexCorsConfiguration.java

0
Capricorn 2018-11-28 06:19.

Tôi đã phải sửa đổi câu trả lời của Lars một chút, vì một đứa trẻ mồ côi \kết thúc trong regex, để chỉ so sánh máy chủ thực tế (không chú ý đến giao thức hoặc cổng) và tôi muốn hỗ trợ localhostmiền bên cạnh miền sản xuất của mình. Vì vậy, tôi đã thay đổi $allowedtham số thành một mảng.

function getCORSHeaderOrigin($allowed, $input) { if ($allowed == '*') {
        return '*';
    }

    if (!is_array($allowed)) { $allowed = array($allowed); } foreach ($allowed as &$value) { $value = preg_quote($value, '/'); if (($wildcardPos = strpos($value, '\*')) !== false) { $value = str_replace('\*', '(.*)', $value); } } $regexp = '/^(' . implode('|', $allowed) . ')$/';

    $inputHost = parse_url($input, PHP_URL_HOST);

    if ($inputHost === null || !preg_match($regexp, $inputHost, $matches)) {
        return 'none';
    }

    return $input;
}

Cách sử dụng như sau:

if (isset($_SERVER['HTTP_ORIGIN'])) {
    header("Access-Control-Allow-Origin: " . getCORSHeaderOrigin(array("*.myproduction.com", "localhost"), $_SERVER['HTTP_ORIGIN']));
}

Related questions

MORE COOL STUFF

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett đã bất chấp những lời khuyên hẹn hò điển hình khi cô gặp chồng mình.

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Michael Sheen là một diễn viên phi lợi nhuận nhưng chính xác thì điều đó có nghĩa là gì?

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Ngôi sao của Hallmark Colin Egglesfield chia sẻ về những cuộc gặp gỡ với người hâm mộ ly kỳ tại RomaDrama Live! cộng với chương trình INSPIRE của anh ấy tại đại hội.

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Bạn sẽ phải phủi sạch đầu đĩa Blu-ray hoặc DVD để xem tại sao Northern Exposure trở thành một trong những chương trình nổi tiếng nhất của thập niên 90.

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

8 công dụng tuyệt vời của Baking Soda và Giấm

8 công dụng tuyệt vời của Baking Soda và Giấm

Bạn biết đấy, hai sản phẩm này là nguồn điện để làm sạch, riêng chúng. Nhưng cùng với nhau, chúng có một loạt công dụng hoàn toàn khác.

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Thủy điện rất cần thiết cho lưới điện của Hoa Kỳ, nhưng nó chỉ tạo ra năng lượng khi có nước di chuyển. Bao nhiêu nhà máy thủy điện có thể gặp nguy hiểm khi các hồ và sông cạn kiệt?

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Tóc tỉa từ các tiệm và các khoản quyên góp cá nhân có thể được tái sử dụng như những tấm thảm thấm dầu và giúp bảo vệ môi trường.

Xem đoạn giới thiệu cho bộ phim chuyển thể đầy khói lửa, có sự góp mặt của ngôi sao Edward Norton từ phim Motherless Brooklyn của Jonathan Lethem

Xem đoạn giới thiệu cho bộ phim chuyển thể đầy khói lửa, có sự góp mặt của ngôi sao Edward Norton từ phim Motherless Brooklyn của Jonathan Lethem

Edward Norton đã muốn đưa cuốn tiểu thuyết Motherless Brooklyn của Jonathan Lethem's Joycean 1999 lên màn ảnh kể từ khi nó được xuất bản. Bây giờ, 20 năm sau, một đoạn giới thiệu đã xuất hiện cho câu chuyện sôi nổi, đưa câu chuyện của Lethem trở lại những năm 1950 với rất nhiều gương mặt quen thuộc.

Cách dễ dàng chọn không tham gia trọng tài ràng buộc thẻ Apple

Cách dễ dàng chọn không tham gia trọng tài ràng buộc thẻ Apple

Có thích thú khi sử dụng Thẻ Apple mới của bạn không? Trước khi bạn bắt đầu chi tiêu, có một nhiệm vụ bổ sung cần xem xét: chọn không tham gia trọng tài ràng buộc. Bạn sẽ phát hiện ra các điều khoản trọng tài ràng buộc trong nhiều thỏa thuận tài chính vì nó giúp ngăn các ngân hàng và đối tác kinh doanh của họ không phải ra tòa.

Những người chơi Fortnite World Cup không ghi bàn có cảm giác hài hước về điều đó

Những người chơi Fortnite World Cup không ghi bàn có cảm giác hài hước về điều đó

Điểm số tại vòng chung kết Fortnite World Cup Solo hôm nay là rất lớn, với người chiến thắng Bugha ghi được nhiều hơn 26 điểm so với người về thứ hai là Psalm. Nhưng không phải ai cũng có thể giành chiến thắng: Bốn cầu thủ ra về với 0 điểm, nhưng — ít nhất là trên Twitter — họ là những người thể thao tốt về điều đó.

Báo cáo: Cánh cửa tuyển sinh có thể đã mở cho các ứng viên UCLA có mối quan hệ có ảnh hưởng

Báo cáo: Cánh cửa tuyển sinh có thể đã mở cho các ứng viên UCLA có mối quan hệ có ảnh hưởng

Huấn luyện viên trưởng của bộ môn thể dục dụng cụ UCLA Valorie Kondos-Field theo dõi Katelyn Ohashi thi đấu thăng bằng trong trận gặp Stanford tại Pauley Pavilion vào ngày 10 tháng 3 năm 2019 ở Los Angeles, California. Vụ bê bối gian lận tuyển sinh đại học tiết lộ các chi tiết của một quá trình chính thức hóa để đưa những đứa trẻ thất bại của các gia đình giàu có và nổi tiếng vào các trường đại học đáng tin cậy và danh tiếng, sử dụng một "cửa phụ" đắt tiền cho các bậc cha mẹ mà sự giàu có của họ khiến họ không có cơ hội. chỉ cần tài trợ cho một cánh mới trong khuôn viên trường.

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa. Từ Hollywood đến New York và mọi nơi ở giữa, hãy xem các ngôi sao yêu thích của bạn đang làm gì!

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

Các nhà điều tra đang xem xét liệu nhóm và nghi phạm có biết nhau trước vụ tấn công hay không

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Vụ kiện, nêu tên một số học khu, lập luận rằng dự luật "Không nói đồng tính" được ban hành gần đây của Florida "có hiệu quả im lặng và xóa bỏ học sinh và gia đình LGBTQ +"

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Vào năm 2021, tôi khuyến khích bạn suy nghĩ lại mọi thứ bạn biết về khách hàng mà bạn phục vụ và những câu chuyện bạn kể cho họ. Lùi lại.

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Vào ngày sinh nhật thứ 9 của Felix The Cat, tôi nhớ về một trong những mất mát lớn nhất trong cuộc đời trưởng thành của tôi - Sophie của tôi vào năm 2013. Tôi đã viết bài luận này và chia sẻ nó trên nền tảng này một thời gian ngắn vào năm 2013.

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Tôi ghét từ "tàu đắm". Mọi người cảm thấy thoải mái trong la bàn đạo đức của riêng mình, và khi làm như vậy, họ thấy mình vượt qua sự phán xét.

Tầm nhìn đám mây phi tập trung của DFINITY Blockchain

Lưu ý của người biên tập: Bạn đang xem tài liệu lỗi thời từ blog DFINITY đang được bảo quản cho mục đích lưu trữ.

Tầm nhìn đám mây phi tập trung của DFINITY Blockchain

Bài đăng này khám phá tầm nhìn về đám mây phi tập trung của nhóm DFINITY và cách nó liên quan đến các nhà cung cấp blockchain truyền thống và đám mây hiện có như Amazon Web Services. Các minh chứng về công nghệ DFINITY được áp dụng bởi một mạng lưới quy mô lớn sẽ được thực hiện vào mùa thu năm 2017, sau đó sẽ được gây quỹ Chính cho quỹ hỗ trợ phi lợi nhuận, với mạng “đám mây mở” dự kiến ​​sẽ ra mắt vào đầu mùa hè năm 2018 .

Language