คำถามติดแท็ก mod-rewrite

โมดูลการเขียน URL ใหม่สำหรับ Apache เว็บเซิร์ฟเวอร์

5
เปลี่ยนเส้นทางเปลี่ยน URL หรือเปลี่ยนเส้นทาง HTTP เป็น HTTPS ใน Apache - ทุกสิ่งที่คุณอยากรู้เกี่ยวกับกฎ Mod_Rewrite แต่กลัวที่จะถาม
นี่เป็นคำถามที่ยอมรับได้เกี่ยวกับ mod_rewrite ของ Apache การเปลี่ยน URL คำขอหรือเปลี่ยนเส้นทางผู้ใช้ไปยัง URL อื่นที่ไม่ใช่ URL ที่พวกเขาร้องขอ แต่เดิมนั้นทำได้โดยใช้ mod_rewrite ซึ่งรวมถึงสิ่งต่าง ๆ เช่น: การเปลี่ยน HTTP เป็น HTTPS (หรือวิธีอื่น ๆ ) การเปลี่ยนการร้องขอไปยังหน้าที่ไม่มีอยู่ในการแทนที่ใหม่อีกต่อไป การปรับเปลี่ยนรูปแบบ URL (เช่น? id = 3433 เป็น / id / 3433) นำเสนอหน้าเว็บที่แตกต่างจากเบราว์เซอร์โดยอ้างอิงจากสิ่งที่เป็นไปได้ภายใต้แสงจันทร์และดวงอาทิตย์ ทุกสิ่งที่คุณต้องการยุ่งกับ URL ทุกสิ่งที่คุณอยากรู้เกี่ยวกับกฎ Mod_Rewrite แต่ไม่กล้าถาม! ฉันจะเป็นผู้เชี่ยวชาญในการเขียนกฎ mod_rewrite ได้อย่างไร รูปแบบและโครงสร้างพื้นฐานของกฎ mod_rewrite คืออะไร ฉันต้องมีรูปแบบ / รสชาติของการแสดงออกปกติอะไรบ้าง? …

4
เปลี่ยนเส้นทาง URL ภายใน Apache VirtualHost
ฉันมีเซิร์ฟเวอร์เฉพาะที่มี Apache ซึ่งฉันได้ตั้งค่า VirtualHosts บางตัว ฉันได้ตั้งค่าหนึ่งเพื่อจัดการโดเมน www รวมถึงโดเมนที่ไม่ใช่ www ไฟล์ VH .conf ของฉันสำหรับ www: <VirtualHost *> DocumentRoot /var/www/site ServerName www.example.com <Directory "/var/www/site"> allow from all </Directory> </VirtualHost> ด้วยสิ่งนี้.htaccess: RewriteEngine on RewriteBase / RewriteCond %{HTTP_HOST} ^www.example.com [NC] RewriteRule ^(.*)$ http://example.com/$1 [L,R=301] มีวิธีง่ายๆในการเปลี่ยนเส้นทาง www ไปเป็นรุ่นที่ไม่ใช่ www หรือไม่? ขณะนี้ฉันกำลังส่งทั้งสองเวอร์ชันให้เหมือนกันDocumentRootและใช้งานอยู่.htaccessแต่ฉันแน่ใจว่าฉันต้องสามารถทำได้ในไฟล์ VirtualHost

3
วิธีที่ดีที่สุดในการดีบักไฟล์กำหนดค่า nginx
ฉันมีกฎการเขียนซ้ำจำนวนมากที่ฉันต้องพอร์ตจาก apache ถึง nginx มันเป็นกระบวนการที่ค่อนข้างเจ็บปวดเพราะฉันไม่สามารถดูว่ากฎการเขียนใหม่ของฉันและเงื่อนไข "ถ้า" ทำงานได้ตามที่ฉันต้องการหรือไม่ Apache มีการดีบักสำหรับโมดูลการเขียนใหม่ ฉันจะทำอะไรเพื่อ nginx

3
วิธียกเว้น URL สำหรับ Apache Mod_proxy
เรามีเซิร์ฟเวอร์ Apache สองตัวเป็น front-end และ 4 tomcat เซิร์ฟเวอร์เป็น back-end ที่กำหนดค่าโดยใช้โมดูล mod_proxy เป็น load balancer ตอนนี้เราต้องการแยก urcat Tomcat หนึ่งตัวออกจากตัวปรับสมดุลโหลดโหลด mod_proxy มีวิธีหรือกฎที่จะยกเว้นหรือไม่ การตั้งค่า Proxy Balancer: <Proxy balancer://backend-cluster1> BalancerMember http://10.0.0.1:8080 loadfactor=1 route=test1 retry=10 BalancerMember http://10.0.0.2:8080 loadfactor=1 route=test2 retry=10 </Proxy>

3
ไฟล์. htaccess ที่น่าสงสัย
คำถามนี้ถูกโยกย้ายจาก Stack Overflow เพราะสามารถตอบได้ใน Server Fault อพยพ 10 ปีที่ผ่านมา สิ่งนี้ถูกอัปโหลดไปยังหนึ่งในโฟลเดอร์ FTP ของฉัน ฉันไม่คุ้นเคยกับ Apache แต่ก็ยังอยากรู้อยากเห็นใครบางคนสามารถบอกฉันได้ว่าไฟล์นี้กำลังทำอะไรที่ขี้ขลาด? ขอบคุณ! RewriteEngine On RewriteCond %{HTTP_REFERER} .*google.*$ [NC,OR] RewriteCond %{HTTP_REFERER} .*ask.*$ [NC,OR] RewriteCond %{HTTP_REFERER} .*yahoo.*$ [NC,OR] RewriteCond %{HTTP_REFERER} .*excite.*$ [NC,OR] RewriteCond %{HTTP_REFERER} .*altavista.*$ [NC,OR] RewriteCond %{HTTP_REFERER} .*msn.*$ [NC,OR] RewriteCond %{HTTP_REFERER} .*netscape.*$ [NC,OR] RewriteCond %{HTTP_REFERER} .*aol.*$ [NC,OR] …

8
ฉันจะทดสอบว่า mod_rewrite เปิดใช้งานได้อย่างไร
ฉันตั้งค่าสภาพแวดล้อมสำหรับ WordPress บน apache2 บนการติดตั้งใหม่ของ Ubuntu 12.04 เพื่อให้ URL ที่เป็นมิตรทำงานได้ฉันกำลังพยายามตั้งค่า mod_rewrite ฉันทำตามคำแนะนำที่พบในเน็ตและใช้ a2enmod ตอนนี้ หลังจากรีสตาร์ท apache ฉันต้องการตรวจสอบว่าโหลดโมดูลจริงหรือไม่ คำสั่งที่ฉันพบเพื่อรับรายการของโมดูลที่โหลดคือ: apache2 -t -D DUMP_MODULES อย่างไรก็ตามสิ่งนี้จะส่งกลับข้อผิดพลาด: apache2: ชื่อผู้ใช้ที่ไม่ดี $ {APACHE_RUN_USER} ดังนั้นฉันจะแสดงรายการโมดูลที่โหลดทั้งหมดจริง ๆ หรือตรวจสอบเพื่อดูว่า mod_rewrite ได้เปิดใช้งานหรือไม่

1
Apache mod_rewrite ดับเบิลเข้ารหัสสตริงแบบสอบถามเมื่อเปลี่ยนเส้นทาง
เราพบปัญหาแปลก ๆ (ข้อผิดพลาดหรืออาจ?) กับพฤติกรรมของ Apache mod_rewrite เมื่อผ่านสตริงการสืบค้น ในการทำซ้ำเราได้ติดตั้ง Ubuntu แบบติดตั้ง (oneiric) ที่สะอาดพร้อมการกำหนดค่าเริ่มต้นของ Apache เราได้เปิดใช้งาน mod_rewrite และในการกำหนดค่าไซต์เริ่มต้นเราได้เพิ่มสิ่งต่อไปนี้: RewriteEngine on RewriteRule ^/(.*)$ /r/$1 [R] ในการทดสอบเราใช้ curl: curl -I 'http://[ubuntu-machine]/a/b%20c?a%20b' ผลลัพธ์ที่เกี่ยวข้องคือ: HTTP/1.1 302 Found Server: Apache/2.2.20 (Ubuntu) Location: http://[ubuntu-machine]/r/a/b%20c?a%2520b อย่างที่คุณเห็นสตริงเคียวรีจะถูก Escape สองครั้งซึ่งผิด ไม่มีใครมีความคิดว่าเราจะแก้ไขได้อย่างไร สองสิ่งที่เราได้ลอง: กำลังเพิ่ม [NE] สิ่งนี้ทำให้เรามีสตริงการสืบค้นที่ถูกต้อง แต่ไม่มีการใช้พา ธ ซึ่งทำให้เกิดปัญหาใหม่ กำลังเพิ่ม [NE, B] …


2
Apache URL เขียนใหม่ใน reverse proxy
ฉันปรับใช้ Apache หน้าแอปพลิเคชันที่โฮสต์โดย Karaf (Apache และ Karaf อยู่บนเซิร์ฟเวอร์ที่แยกต่างหาก) ฉันต้องการ Apache ให้ทำงานเป็น reverse proxy และซ่อนบางส่วนของ URL URL ที่จะได้รับเข้าสู่ระบบในหน้าของแอพลิเคชันโดยตรงจากเซิร์ฟเวอร์ app http://app-server:8181/jellyfishเป็น หน้าจะให้บริการโดย Jetty instance ที่ทำงานภายใน Karaf แน่นอนว่าพฤติกรรมนี้มักจะถูกปิดกั้นโดยไฟร์วอลล์สำหรับทุกอย่างยกเว้นพร็อกซีเซิร์ฟเวอร์ย้อนกลับ เมื่อปิดไฟร์วอลล์หากคุณกด URL นี้ Jetty จะโหลดหน้าเข้าสู่ระบบ แถบที่อยู่ของเบราว์เซอร์เปลี่ยนไปอย่างถูกต้องhttp://app-server:8181/jellyfish/login?0และทุกอย่างทำงานได้ สิ่งที่ฉันต้องการคือhttp://web-server(เช่นจากรูท) เพื่อแม็พกับ Jetty บนเซิร์ฟเวอร์แอปด้วยชื่อของแอพ ( jellyfish) ที่ถูกระงับ เช่นเบราว์เซอร์จะเปลี่ยนไปแสดงhttp://web-server/login?0ในแถบที่อยู่และ URL และเนื้อหาที่ตามมาทั้งหมดจะแสดงพร้อมกับโดเมนของเว็บเซิร์ฟเวอร์และไม่มีjellyfishความยุ่งเหยิง ฉันสามารถให้ Apache ทำงานเป็น reverse proxy อย่างง่ายโดยใช้ config (ตัวอย่าง): - …

3
ส่งคืน“ 200 OK” ใน Apache บนคำขอ HTTP OPTIONS
ฉันพยายามใช้การควบคุมการเข้าถึง HTTPข้ามโดเมนโดยไม่ต้องแตะรหัสใด ๆ ฉันมีเซิร์ฟเวอร์ Apache (2) ของฉันคืนส่วนหัวการควบคุมการเข้าถึงที่ถูกต้องด้วยบล็อกนี้: Header set Access-Control-Allow-Origin "*" Header set Access-Control-Allow-Methods "POST, GET, OPTIONS" ตอนนี้ผมต้องป้องกันไม่ให้ Apache จากการดำเนินการรหัสของฉันเมื่อเบราว์เซอร์ส่งHTTP OPTIONSคำขอ (มันเก็บไว้ในREQUEST_METHODตัวแปรสภาพแวดล้อม) 200 OKกลับ ฉันจะกำหนดค่า Apache ให้ตอบสนอง "200 OK" เมื่อวิธีการร้องขอเป็นตัวเลือกได้อย่างไร ฉันได้ลองmod_rewriteบล็อกนี้แล้ว แต่ส่วนหัวการควบคุมการเข้าถึงหายไป RewriteEngine On RewriteCond %{REQUEST_METHOD} OPTIONS RewriteRule ^(.*)$ $1 [R=200,L]

4
URL ที่เขียนซ้ำที่มีความยาวพารามิเตอร์> 255 ไม่ทำงาน
ฉันใช้ mod_rewrite เพื่อเขียน URL เช่นนี้: http://example.com/1,2,3,4/foo/ โดยทำสิ่งนี้ใน. htaccess: RewriteEngine On RewriteRule ^([\d,]+)/foo/$ /foo.php?id=$1 [L,QSA] มันทำงานได้ดียกเว้นเมื่อ "1,2,3,4" เปลี่ยนเป็นสตริงที่มีความยาวมากกว่า 255 ตัวอักษร Apache จะส่งคืน "403 Forbidden" ไม่มีปัญหาในการเยี่ยมชมfoo.php?id=1,2,3,4โดยตรงแม้จะมีสตริง id ยาวมาก แต่นี่ไม่ใช่ตัวเลือกสำหรับฉัน มี Apache หรือการตั้งค่าอื่น ๆ ที่ฉันควรปรับแต่งหรือไม่? อัปเดต : ฉันเปิด RewriteLog ด้วย RewriteLogLevel 9. ด้วยสตริง id สั้น ๆ ฉันได้หลายบรรทัดในไฟล์บันทึกของฉัน แต่เมื่อสตริง id มากกว่า 255 ตัวอักษรไม่มีสิ่งใดที่ถูกบันทึกไว้ (ดูเหมือนว่า …

1
Apache สามารถทำการเขียนซ้ำจากส่วนหัว http แบบกำหนดเองได้ตามเงื่อนไขหรือไม่
ฉันมีเซิร์ฟเวอร์ apache ที่อยู่เบื้องหลัง load balancer (amazon แบบง่าย) ฉันต้องการเปลี่ยนเส้นทางการรับส่งข้อมูลใด ๆ ที่ไม่ใช่ 443 ถึง 443 ฉันต้องการให้ใช้ apache โฮสต์เสมือนเพียงโฮสต์เดียว ดังนั้นฉันจึงพยายามตรวจสอบว่าหากส่วนหัว HTTP_X_FORWARDED_PORT ไม่ใช่ 443 ฉันตรวจสอบRewriteCond docsแล้วและใช้ได้กับส่วนหัว HTTP ที่ จำกัด เท่านั้น โดยพื้นฐานแล้วสิ่งที่ฉันทำคือ: <VirtualHost *:80> ServerName www.example.com RewriteEngine On RewriteCond %{HTTP_X_FORWARDED_PORT} !=443 RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L] .... </VirtualHost> แต่ RewriteCond ไม่รู้จัก HTTP_X_FORWARDED_PORT มีวิธีอื่นอีกไหมในการทำสิ่งนี้ให้สำเร็จ (ด้วย VirtualHost เพียงอันเดียว)? …

1
ความยาวสูงสุดของ URL 257 ตัวอักษรสำหรับ mod_rewrite?
แบบแผน URL ของฉันคือ /foo/var1-var2-var3.../bar ฉันใช้กฎ mod_rewrite เหล่านี้: RewriteBase /foo/ RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^ index.php [PT,L] หากความยาวของสตริง 'var1-var2 ... ' มากกว่า 257 ตัวอักษรแสดงว่าข้อผิดพลาด 403 ต้องห้ามและส่งคืน 404 อย่างไรก็ตามหากความยาวของสตริง 'var1-var2 ... ' คือ 257 ตัวอักษรหรือน้อยกว่าและตามด้วยสแลชความยาวของ url ที่เหลืออาจยาวเท่าใดก็ได้ เราจะเอาชนะขีด จำกัด นี้ได้อย่างไร

3
apache2.4 mod_rewrite ไม่รวมนามแฝงเฉพาะ directroy / uri
ฉันมีการตั้งค่าต่อไปนี้ในหนึ่งใน vhosts ของฉัน: ...<VirtualHost *:80> ServerName cloud.domain.de ServerAdmin webmaster@domain.de ServerSignature Off Alias "/.well-known/acme-challenge" "/var/www/domain.de/vh-www/htdocs/public/.well-known/acme-challenge" <Directory "/var/www/domain.de/vh-www/htdocs/public/.well-known/acme-challenge"> Require all granted ForceType 'text/plain' </Directory> <ifmodule mod_rewrite.c> RewriteEngine On RewriteCond %(REQUEST_URI) !/\.well\-known/acme\-challenge/?.* RewriteCond %{HTTPS} off # RewriteRule ^\.well-known/acme-challenge/([A-Za-z0-9-]+)/?$ - [L] RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] </ifmodule>... สิ่งที่ฉันต้องการบรรลุคือ mod_rewrite นั้นไม่ได้เขียน URL http://cloud.domain.de/.well-known/acme-challenge/ซ้ำเมื่อเข้าถึงurl ฉันได้ลองใช้วิธีที่แตกต่างกันแล้วหนึ่งในนั้นเป็น RewriteRule ที่แสดงความคิดเห็นข้างต้น …

4
การควบคุมเป้าหมายพร็อกซี Nginx โดยใช้คุกกี้หรือไม่
ฉันพยายามแปลงพร็อกซีย้อนกลับโดยใช้การตั้งค่า Apache mod_rewrite ที่น่าสนใจเพื่อใช้ Nginx แทน (เนื่องจากความกังวลภายนอกที่เราย้ายจาก Apache เป็น Nginx และทุกอย่างทำงานได้ดียกเว้นส่วนนี้) การตั้งค่าดั้งเดิมของฉันคือการอ่านคุกกี้ HTTP (กำหนดโดยแอพพลิเคชั่นบางตัว) และขึ้นอยู่กับค่าของมัน มันเป็นอะไรเช่นนี้: RewriteCond %{HTTP_COOKIE} proxy-target-A RewriteRule ^/original-request/ http://backend-a/some-application [P,QSA] RewriteCond %{HTTP_COOKIE} proxy-target-B RewriteRule ^/original-request http://backend-b/another-application [P,QSA] RewriteRule ^/original-request http://primary-backend/original-application [P,QSA] ฉันพยายามทำสิ่งเดียวกันโดยใช้ Nginx และการกำหนดค่าเริ่มต้นของฉันเป็นแบบนี้ (โดยที่ "proxy_override" เป็นชื่อของคุกกี้): location /original-request { if ($cookie_proxy_override = "proxy-target-A") { rewrite . …

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.